根据值对对象组进行分组

时间:2016-09-21 19:19:46

标签: javascript arrays

我有一个对象数组

[
  { values: [2, 7, 1] },
  { values: [1, 2, 7] },
  { values: [7, 1, 2] },
  { values: [3, 4, 5] },
  { values: [2, 1, 8] },
  { values: [2, 1, 8] },
]

我想将这些对象与具有相同值的其他对象组合在一起。所以这个对象数组应该分为3组,因为前3个对象具有相同的值,下一个对象是唯一的,最后2个对象具有相同的值。

如示例中所示,值可以具有不同的顺序,但仍应被视为相同。

我正在考虑让每个元素遍历其余元素并查看它们是否相似,但它会导致O(n^2)

我想我应该从已经分组的数组中删除元素。

那么我怎样才能有效地将其分组为

[[first, second, third],[fourth],[fifth,sixth]]

2 个答案:

答案 0 :(得分:2)

这样的东西?

var data = [
  { values: [2, 7, 1] },
  { values: [1, 2, 7] },
  { values: [7, 1, 2] },
  { values: [3, 4, 5] },
  { values: [2, 1, 8] },
  { values: [2, 1, 8] },
];

var hash = {};
for(var obj of data) {
  var key = obj.values.sort().join("-");
  if (!hash[key]) hash[key] = [];
  hash[key].push(obj);
}
var result = [];
for(var k in hash) result.push(hash[k])
console.log(result)

或js6变种:

var data = [
  { values: [2, 7, 1] },
  { values: [1, 2, 7] },
  { values: [7, 1, 2] },
  { values: [3, 4, 5] },
  { values: [2, 1, 8] },
  { values: [2, 1, 8] },
];

var hash = data.reduce((hash, obj) => {
  const key = obj.values.sort().join("-");
  if (!hash[key]) hash[key] = [];
  hash[key].push(obj);
  return hash;
}, [])

var result = Object.keys(hash).map(k => hash[k])
console.log(result)

答案 1 :(得分:1)

您可以使用forEach()循环和sort()

执行此操作

var arr = [
  { values: [2, 7, 1] },
  { values: [1, 2, 7] },
  { values: [7, 1, 2] },
  { values: [3, 4, 5] },
  { values: [2, 1, 8] },
  { values: [2, 1, 8] },
];

var result = [];
arr.forEach(function(e) {
  var s = [].concat(e.values).sort().join('|');
  if (!this[s]) {
    this[s] = [e.values];
    result.push(this[s]);
  } else {
    this[s].push(e.values)
  }
})

console.log(result)