如何在javascript中生成asscoiate对象数组?

时间:2018-03-09 15:55:03

标签: javascript arrays

我在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

3 个答案:

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

答案 1 :(得分:0)

我使用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)




答案 2 :(得分:-1)

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

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