将 objects 的数组缩减为具有相同 objects 的参数
Reduce array of objects to parameter with the same objects
我希望标题足够 self-explanatory 但我会尝试用我创建的 fiddle 来澄清。有两个数组,一个叫做标签,这是我目前拥有的,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: ...
}
]
我有第一种情况,想转换 l10n 中的所有内容,这样它们就没有 lang: english 参数,而是有一个名为 english 的 object 和里面的 name/title那个。在这两个标签下面是我尝试做的事情以及当我只将 l10n object 传递给它时有效的方法,而不是整个事情(我明白为什么,现在我想知道如何做我正在做的事情真的之后)。
另外,请注意我的数组此时不正确。我在下一个 object 的开头附加了三个点,只是为了指出我的数组中有多个 object。
这是 fiddle:
https://jsfiddle.net/cgvpuj70/
您可以迭代外部数组并为内部数组映射新对象。
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; }
在 l10n
上使用 .reduce()
使一个对象填充有从当前数组中的每个对象派生的 keys/values。
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);
您所要做的就是创建一个空对象并填充它。首先,创建新对象。然后,对于 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);
}
我希望标题足够 self-explanatory 但我会尝试用我创建的 fiddle 来澄清。有两个数组,一个叫做标签,这是我目前拥有的,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: ...
}
]
我有第一种情况,想转换 l10n 中的所有内容,这样它们就没有 lang: english 参数,而是有一个名为 english 的 object 和里面的 name/title那个。在这两个标签下面是我尝试做的事情以及当我只将 l10n object 传递给它时有效的方法,而不是整个事情(我明白为什么,现在我想知道如何做我正在做的事情真的之后)。
另外,请注意我的数组此时不正确。我在下一个 object 的开头附加了三个点,只是为了指出我的数组中有多个 object。
这是 fiddle: https://jsfiddle.net/cgvpuj70/
您可以迭代外部数组并为内部数组映射新对象。
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; }
在 l10n
上使用 .reduce()
使一个对象填充有从当前数组中的每个对象派生的 keys/values。
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);
您所要做的就是创建一个空对象并填充它。首先,创建新对象。然后,对于 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);
}