我是Java语言的新手。我想从相等的元素(元素是对象)创建2D数组。例如,
oldArray = [a,b,c,d,e,f] (a=b=f, d=e)
可以说对象a
等于对象b
和对象f
。然后,对象d
等于对象e
。所以新的数组应该是
newArray = [[a,b,f],[c],[d,e]]
任何帮助将不胜感激。
答案 0 :(得分:2)
使用Array.reduce()
创建一个groupBy
函数。 groupBy
函数接受谓词,因此您可以定义分组属性/值。分组的结果是一个对象,其中每个属性是一组项目(数组)。使用Object.values()
提取到数组数组。
const groupBy = (predicate, arr) =>
arr.reduce((r, o) => ({
...r,
[predicate(o)]: [...r[predicate(o)] || [], o]
}), {});
const data = [{ id: 'a', val: 1 }, { id: 'b', val: 1 }, { id: 'c', val: 2 }, { id: 'd', val: 3 }, { id: 'e', val: 3 }, { id: 'f', val: 1 }];
const result = Object.values(groupBy(({ val}) => val, data));
console.log(result);
答案 1 :(得分:0)
您可以尝试关注
temp
数组,其中包含具有属性的对象
oldArray
,并针对其中的每个对象检查其是否存在于temp
数组中。
temp
数组中为其添加一个条目,并将其添加到结果数组中。
let a = {x:1}, c = {y:2}, d = {z:3};
let b = a, f = a, e = d;
let oldArray = [a,b,c,d,e,f];
let result = [];
let temp = [];
oldArray.forEach(c => {
let item = temp.find(o => o.obj === c);
if(item) result[item.index].push(c);
else {
temp.push({obj:c,index:result.length});
result.push([c]);
}
});
console.log(result);