假设我有一个这样的数组:
var arr = [
{type:"orange", title:"First"},
{type:"orange", title:"Second"},
{type:"banana", title:"Third"},
{type:"banana", title:"Fourth"}
];
我希望将其拆分为具有相同类型对象的数组:
[{type:"orange", title:"First"},
{type:"orange", title:"Second"}]
[{type:"banana", title:"Third"},
{type:"banana", title:"Fourth"}]
但我想通用地执行此操作,因此没有指定橙色或香蕉的 if 语句
// not like this
for (prop in arr){
if (arr[prop] === "banana"){
//add to new array
}
}
想法? JQuery 和 Underscore 都是可以使用的选项。
最佳答案
这对 Array.reduce(...)
来说很容易:
function groupBy(arr, property) {
return arr.reduce(function(memo, x) {
if (!memo[x[property]]) { memo[x[property]] = []; }
memo[x[property]].push(x);
return memo;
}, {});
}
var o = groupBy(arr, 'type'); // => {orange:[...], banana:[...]}
o.orange; // => [{"type":"orange","title":"First"},{"type":"orange","title":"Second"}]
o.banana; // => [{"type":"banana","title":"Third"},{"type":"banana","title":"Fourth"}]
当然,如果您的目标浏览器不支持 ECMAScript 262 第 5 版,那么您必须自己实现“reduce”,或者使用 polyfill 库,或者选择其他答案。
[更新]这是一个适用于任何版本的 JavaScript 的解决方案:
function groupBy2(xs, prop) {
var grouped = {};
for (var i=0; i<xs.length; i++) {
var p = xs[i][prop];
if (!grouped[p]) { grouped[p] = []; }
grouped[p].push(xs[i]);
}
return grouped;
}
关于javascript - 根据属性将对象数组分解为单独的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14696326/