2017-08-16 48 views
1

我希望标题足以不言自明,但我会尝试用我创建的小提琴进行说明。有两个数组,一个叫做标签,这是我目前拥有的和tags_ideal,这是我真正想要实现的。使用相同的对象将参数数组减少到参数

当前状态:

var tags = [ 
    { 
    id: 1, 
    color: 'red', 
    l10n: [ 
     { 
     name: 'Something something', 
     lang: 'english' 
     }, 
     { 
     name: 'Etwas etwas', 
     lang: 'deutsch' 
     } 
    ] 
    }, 
    { 
    id: 2, 
    color: 'blue', 
    l10n: ... 
    } 
] 

什么我后:

var tags_ideal = [ 
    { 
    id: 1, 
    color: 'red', 
    l10n: { 
     'english': { 
     name: 'Something something', 
     }, 
     'deutsch': { 
     name: 'Etwas etwas', 
     } 
    } 
    }, 
    { 
    id: 2, 
    color: 'blue', 
    l10n: ... 
    } 
] 

我第一种情况,并希望所有的东西转换来自本地化,使他们没有郎:英文参数,而是有一个叫做english的对象,里面有名字/标题。这两个标签下面是我试图做的事情,当我将l10n对象传递给它时,它的作用是什么,但不是全部(我明白为什么,现在我想知道如何去做我真正想做的事情)。

另外,请注意,我的数组在这一点上是不正确的。我在下一个对象的开始处附加了三个点,以指出数组中有多个对象。

这里的小提琴: https://jsfiddle.net/cgvpuj70/

回答

1

l10n使用.reduce()使填充了来自在当前阵列的每个对象导出的键/值的对象。

var tags = [ 
 
    { 
 
    id: 1, 
 
    color: 'red', 
 
    l10n: [ 
 
     { 
 
     name: 'Something something', 
 
     lang: 'english' 
 
     }, 
 
     { 
 
     name: 'Etwas etwas', 
 
     lang: 'deutsch' 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    id: 2, 
 
    color: 'blue' 
 
    } 
 
] 
 

 
tags.forEach(t => { 
 
    t.l10n = t.l10n && t.l10n.reduce((o, data) => 
 
    Object.assign(o, {[data.lang]: {name: data.name}}) 
 
    , {}) 
 
}) 
 

 
console.log(tags);

+0

太棒了!奇迹般有效。 – twenty

+0

很高兴帮助! – spanky

2

你可以遍历外阵列并映射为内部数组的新对象。

var tags = [{ id: 1, color: 'red', l10n: [{ name: 'Something something', lang: 'english' }, { name: 'Etwas etwas', lang: 'deutsch' }] }, { id: 2, color: 'blue', l10n: [] }]; 
 

 
tags.forEach(a => a.l10n = a.l10n.map(b => ({ [b.lang]: { name: b.name } }))); 
 

 
console.log(tags);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

虽然我得到如下相同的结果,我标志着整个对象Spanky的答案是正确的,因为它的工作原理不需要修改任何东西来绕过Eslinter。非常感谢! – twenty

0

所有你需要做的就是创建一个空的对象,并填满它。首先,创建新的对象。然后,对于l10n阵列的每个元素,设置object[element.lang]等于element.name。现在你已经去了新的json结构。

这里是一个修改translate功能:

function translate(title) { 
    var object = {}; 
    for (var i=0; i<title.length; i++) { 
    var element = title[i]; 
    object[element.lang] = element.name; 
    } 
    return object; 
} 

编辑:这里是你如何转化

var newTags = []; 
for (var i=0; i<tags.length; i++) { 
    var edited = {}; 
    edited.id = tags[i].id; 
    edited.color = tags[i].color; 
    edited.l10n = translate(tags[i].l10n); 
    newTags.push(edited); 
} 
+0

在我看来,这只是工作,如果我通过l10n到它,但不是整个标签var? – twenty

+0

我将编辑答案以提供实施。 – clabe45