通过对一个对象数组进行排序动态创建多个数组
Dynamically create multiples arrays from sorting one array of objects
给定以下对象数组:
var fruits = [
{ type: "banana", number: 20 },
{ type: "apple", number: 2 },
{ type: "pineapple", number: 40 },
{ type: "pineapple", number: 32 },
{ type: "banana", number: 80 },
{ type: "pineapple", number: 24 },
{ type: "apple", number: 64 },
{ type: "apple", number: 12 }
]
如何按类型键排序,并动态地为每个类型创建一个新的对象数组?要获得这样的内容:
// new array of bananas:
[
{ type: "banana", number: 20 },
{ type: "banana", number: 80 }
]
// new array of apples:
[
{ type: "apple", number: 2 },
{ type: "apple", number: 64 },
{ type: "apple", number: 12 }
]
// new array of pineapples:
[
{ type: "pineapple", number: 40 },
{ type: "pineapple", number: 32 },
{ type: "pineapple", number: 24 }
]
这是我的解决方案,循环遍历项目,将其放入具有匹配键的列表
var fruits = [
{ type: "banana", number: 20 },
{ type: "apple", number: 2 },
{ type: "pineapple", number: 40 },
{ type: "pineapple", number: 32 },
{ type: "banana", number: 80 },
{ type: "pineapple", number: 24 },
{ type: "apple", number: 64 },
{ type: "apple", number: 12 }
];
var data = {};
fruits.forEach(function(fruit){
if (data[fruit.type]) {
data[fruit.type].push(fruit);
} else {
data[fruit.type] = [fruit];
}
});
console.log(data);
您可以使用Array.prototype.reduce()
, Object.hasOwnProperty()
var res = fruits.reduce(function(obj, fruit) {
if (!obj.hasOwnProperty(fruit.type)) {
obj[fruit.type] = [fruit]
} else {
obj[fruit.type].push(fruit)
};
return obj
}, {});
console.log(res);
使用
Array#filter
filter()
方法创建一个新的数组,其中包含通过所提供的function
实现的测试的所有元素。(arr.filter(callback[, thisArg])
)
注意:您可以根据key
创建通用函数进行过滤。
var fruits = [{
type: "banana",
number: 20
}, {
type: "apple",
number: 2
}, {
type: "pineapple",
number: 40
}, {
type: "pineapple",
number: 32
}, {
type: "banana",
number: 80
}, {
type: "pineapple",
number: 24
}, {
type: "apple",
number: 64
}, {
type: "apple",
number: 12
}];
var filter = function(arr, key) {
return arr.filter(function(item) {
return item.type === key;
})
}
var apples = filter(fruits, 'apple');
var bananas = filter(fruits, 'banana');
var pineapples = filter(fruits, 'pineapple');
console.log(apples);
console.log(bananas);
console.log(pineapples);
我认为这是一组:
var fruits = [
{ type: "banana", number: 20 },
{ type: "apple", number: 2 },
{ type: "pineapple", number: 40 },
{ type: "pineapple", number: 32 },
{ type: "banana", number: 80 },
{ type: "pineapple", number: 24 },
{ type: "apple", number: 64 },
{ type: "apple", number: 12 }
]
var dict = {};
fruits.forEach(fruit => {
dict[fruit.type] = (dict[fruit.type] || [])
.concat([fruit]);
});
var groups = Object.keys(dict).map(k => dict[k]);
console.log(groups);
这是ES6的另一种奇特方式;
var fruits = [
{ type: "banana", number: 20 },
{ type: "apple", number: 2 },
{ type: "pineapple", number: 40 },
{ type: "pineapple", number: 32 },
{ type: "banana", number: 80 },
{ type: "pineapple", number: 24 },
{ type: "apple", number: 64 },
{ type: "apple", number: 12 }
],
grouped = [...fruits.reduce((p,c) => p.set(c.type, p.has(c.type) ? p.get(c.type).concat(c)
: [c]), new Map()).values()];
console.log(grouped);
相关文章:
- 如何向JSON数组动态添加属性
- Javascript数组动态
- 使用RequireJS从数组动态加载模块
- 在主要的JavaScript引擎中,在JavaScript关联数组(动态对象属性)中检索/插入的复杂性是多少
- 基于PHP数组动态附加表单
- jQuery:从带有 for 循环的数组动态构建表单
- JSon 数组动态列填充 AngularJs
- 使用 Javascript 创建变量数组(动态,下拉)
- 从数组动态构建表
- Ext 3.4-如何使用本地数组动态填充组合框
- jquery将数组动态地输入到slug
- 用字符串和字符串数组动态填充json对象
- 如何在Meteor中使用数组动态渲染多个模板
- 如何从json字段数组动态创建一个没有jquery的表单
- 用数组动态填充多维数组
- Jquery数组动态初始化
- 根据json创建的2d数组动态填充表
- Knockout:基于未知长度的数组动态创建可观察对象
- 使用数组动态注册事件
- jQuery多维数组(动态键)-不能设置属性undefined