【问题标题】:How to generate asscoiate array of objects in javascript?如何在javascript中生成关联的对象数组?
【发布时间】:2018-03-09 15:55:03
【问题描述】:

我在 javascript 中有以下类型的数组:

var fruits = [{id: 'apple', field1: 'value1', field2: 'value2'},
{id: 'orange', field1: 'value1', field2: 'value2'},
{id: 'banana', field1: 'value1', field2: 'value2'},
{id: 'apple', field1: 'value1', field2: 'value2'},
{id: 'apple', field1: 'value1', field2: 'value2'},
{id: 'banana', field1: 'value1', field2: 'value2'},
{id: 'orange', field1: 'value1', field2: 'value2'}
];

我想迭代这个数组并将值存储在另一个关联数组中,新数组如下所示:

var fruits = {
    apple: [{id: 'apple', field1: 'value1', field2: 'value2'},
            {id: 'apple', field1: 'value1', field2: 'value2'},
            {id: 'apple', field1: 'value1', field2: 'value2'}
            ],
    orange: [{id: 'orange', field1: 'value1', field2: 'value2'},
            {id: 'orange', field1: 'value1', field2: 'value2'}
            ],
    banana: [{id: 'banana', field1: 'value1', field2: 'value2'},
            {id: 'banana', field1: 'value1', field2: 'value2'}
            ]       
}

我尝试了以下操作,但没有按预期工作:

var outputArray = [];
$.each(fruits, function (index, fruit)
{
    var key = fruit.id; 
    outputArray[key][outputArray[key].length] = fruit;
    //outputArray[key][] = fruit; // this is also not working
});

有人可以帮助编写代码以在 javascript 中将第一个数组转换为第二个数组吗?我可以在 PHP 中轻松地进行这种转换,但无法找到在 javascript 中完成相同工作的方法。这里是JSFiddle

【问题讨论】:

  • 代码库。并告诉我们你卡在哪里
  • 正如它现在所写的,这是一个“给我代码”的问题。向我们展示您是如何尝试的。如果您使用的是Lodash, this is pretty simple
  • 请确保在 Minimal, Complete, and Verifiable example 中包含 您的 当前代码,以展示当前问题。所以我们可以帮助(不是为你做的)
  • 冷静下来 :) 请检查更新的问题。

标签: javascript arrays


【解决方案1】:

对您的原始功能进行一些更正应该可以做到这一点。

var output = {}; // empty object
$.each(fruits, function (index, fruit)
{
    var key = fruit.id;
    // check property exists otherwise initialize it
    if (!output[key]) output[key] = [];
    output[key].push(fruit);
});

【讨论】:

  • 谢谢。这个答案最接近我的尝试。
【解决方案2】:

我有这个使用 Array.reduce() 的解决方案

var fruits = [{id: 'apple', field1: 'value1', field2: 'value2'},
  {id: 'orange', field1: 'value1', field2: 'value2'},
  {id: 'banana', field1: 'value1', field2: 'value2'},
  {id: 'apple', field1: 'value1', field2: 'value2'},
  {id: 'apple', field1: 'value1', field2: 'value2'},
  {id: 'banana', field1: 'value1', field2: 'value2'},
  {id: 'orange', field1: 'value1', field2: 'value2'}
];


const groupedFruits = fruits.reduce((accumulator, currentValue) => {
  const typeOfFruit = currentValue.id

    if (!accumulator[typeOfFruit]) {
      accumulator[typeOfFruit] = []
    }
    accumulator[typeOfFruit] = [...accumulator[typeOfFruit] ,currentValue]

    return accumulator

}, [])

console.log(groupedFruits)

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点,这里只是一种解决方案。获取所有唯一的水果名称,然后通过 id 从原始数组中收集它们并存储在result 对象中。这是一个sn-p:

    const fruits = [{id: 'apple', field1: 'value1', field2: 'value2'},
    {id: 'orange', field1: 'value1', field2: 'value2'},
    {id: 'banana', field1: 'value1', field2: 'value2'},
    {id: 'apple', field1: 'value1', field2: 'value2'},
    {id: 'apple', field1: 'value1', field2: 'value2'},
    {id: 'banana', field1: 'value1', field2: 'value2'},
    {id: 'orange', field1: 'value1', field2: 'value2'}
    ];
    const uniqueFruitNames = fruits.map(f => f.id).filter((v, i, a) => a.indexOf(v) === i); /* filter duplicates */
    const result = {};
    uniqueFruitNames.forEach(name => {
      result[name] = fruits.filter(fruit => fruit.id === name);
    });
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2019-04-06
      • 2015-04-22
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多