我在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。
答案 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);