从相等的元素创建双精度数组

时间:2018-12-19 13:00:35

标签: javascript ecmascript-6

我是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]]

任何帮助将不胜感激。

2 个答案:

答案 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数组,其中包含具有属性的对象
    • obj-对象的引用
    • index-对象在所得数组中的索引
  • 遍历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);