我有以下数组
var data = [
{material:1, item:'A'}
{material:2, item:'B'}
{material:1, item:'C'}
{material:1, item:'D'}
]
期待的是获得此阵列对象中的材料
所以我希望最终的解决方案是一个只有1和2的数组
var materials = [1,2]
所以现在被困在这里
data.forEach((item)=>{
//here am stuck on how to proceed
})
答案 0 :(得分:3)
如果您使用的是ES6,则可以使用Set。
var materials = new Set(data.map(d => d.material));
如果愿意,您可以轻松地将该集转换回数组。
答案 1 :(得分:2)
reduce
变成Set
,然后将集合变回数组。另外请注意,您需要修复data
的语法-数组项需要用逗号分隔:
var data=[{material:1,item:'A'},
{material:2,item:'B'},
{material:1,item:'C'},
{material:1,item:'D'}];
const set = data.reduce((set, { material }) => set.add(material), new Set());
console.log([...set]);
答案 2 :(得分:0)
您要做什么:
var data = [{
material: 1,
item: 'A'
}, {
material: 2,
item: 'B'
}, {
material: 1,
item: 'C'
}, {
material: 1,
item: 'D'
}]
var materials = [];
data.forEach(function(elem) {
var material = elem.material;
if (materials.includes(material)) {} else {
materials.push(material);
}
})
console.log(materials)
如果您需要任何说明,请告诉我。
答案 3 :(得分:0)
每个人都已经指出了使用Set
的明显答案。这可以说是一种更灵活的方法。
const data = [
{ material:1, item:'A' },
{ material:2, item:'B' },
{ material:1, item:'C' },
{ material:1, item:'D' }
]
const map = data.reduce((acc, { material, item }) => {
acc[material] = material in acc
? [ ...acc[material], item ]
: [ item ]
return acc
}, {})
// materials and items made of that material
console.log(map) // { 1: [ 'A', 'C', 'D' ], 2: [ 'B' ] }
// unique materials
console.log(Object.keys(map)) // [ '1', '2' ]
如果您需要执行更多操作(如查找所有由X元素制成的材料),从长远来看,这将提高性能。不用过滤,您只需要data[material]