我有一个对象数组。我想重新格式化为一个新阵列,但我不知道如何开始。我有jQuery和Underscore可用。
这是我原来的数组:
var myArray = [
{
"name": "Product",
"value": "Car"
},
{
"name": "Product",
"value": "Boat"
},
{
"name": "Product",
"value": "Truck"
},
{
"name": "Color",
"value": "Blue"
},
{
"name": "Location",
"value": "Store"
}
];
以下是我试图让新数组看起来像:
var newArray = [
{
"name": "Product",
"value": "Car Boat Truck"
},
{
"name": "Color",
"value": "Blue"
},
{
"name": "Location",
"value": "Store"
}
];
在newArray中,产品都在一个对象中。
答案 0 :(得分:2)
您可以使用groupBy
方法将所有具有相同名称的元素放在一起,然后map
将它们转换为您想要的内容。 pluck
在此处用于组合输出数组中的值。
这是一个快速,简单的解决方案:
var newArray = _.chain(myArray)
.groupBy("name")
.map(function(a) {
return {
"name": a[0].name,
"value": _.pluck(a, "value").join(" ")
};
})
.value();
仅仅为了完整性,这里是非链式版本:
var newArray = _.map(_.groupBy(myArray, "name"), function(a) {
return {
"name": a[0].name,
"value": _.pluck(a, "value").join(" ")
};
});
答案 1 :(得分:2)
这是一个更通用的解决方案,可以重复使用,而不是硬编码。这样,您可以为不同对象集合的不同属性创建多个groupBy方法,然后加入所需的属性。 jsFiddle
function groupBy(groupBy) {
return function(source, joinOn) {
return _.each(_.groupBy(source, groupBy), function(val, key, context){
context[key] = _.pluck(val, joinOn).join(' ');
});
};
}
var groupByNameOn = groupBy('name');
console.log(groupByNameOn(arr, 'value'));