使用相同的对象将对象数组减少为参数

时间:2017-08-16 19:56:18

标签: javascript arrays object reduce

我希望标题足够自我解释,但我会尝试用我创造的小提琴来澄清。有两个数组,一个叫做标签,这是我现在拥有的,而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的对象,其中包含名称/标题。下面两个标签是我试图做的,当我将l10n对象传递给它时有效,但不是整个事情(我明白为什么,现在我想知道如何做我真正追求的事情)。

另外,请注意我的阵列在这一点上不正确。我在下一个对象的开头添加了三个点,只是为了指出我的数组中有多个对象。

这是小提琴: https://jsfiddle.net/cgvpuj70/

3 个答案:

答案 0 :(得分:2)

您可以迭代外部数组并映射内部数组的新对象。



from xlsxwriter.utility import xl_rowcol_to_cell

cell = xl_rowcol_to_cell(1, 2)  # C2

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);




答案 1 :(得分:1)

.reduce()上使用l10n,使用从当前数组中每个对象派生的键/值填充对象。

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);

答案 2 :(得分: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);
}