识别二维阵列中的部分重复项


var items = [['892','NEW','blue'],
         ['341','USED','red'],
         ['892','NEW','yellow'],
         ['121','USED','blue'],
         ['735','NEW','red'],
         ['121','NEW','blue'],
         ['121','USED','yellow']];

每个项目都有 3 个元素。如果项目的前 2 个元素的确切组合出现在数组中的其他地方,那么我需要输出这两个元素。因此,在这种情况下,所需的输出应该是:

output = [['892','NEW'],
          ['121','USED]];

功能强大且简单:

var items = [['892','NEW','blue'],
         ['341','USED','red'],
         ['892','NEW','yellow'],
         ['892','NEW','yellow'],
         ['892','NEW','yellow'],
         ['121','USED','blue'],
         ['735','NEW','red'],
         ['121','NEW','blue'],
         ['121','USED','yellow']];
var output = [];
var spotted = {};
items.map(function(el){
    var string = ''+el[0]+el[1];
    if(spotted[string] === 0){ 
       output.push([el[0],el[1]]);
       spotted[string] = 1;
    }else if(spotted[string] != 1) spotted[string] = 0;
});
console.log(output);

这是我的实现。我创建了一个集合来跟踪我已经看到的元素。如果它存在于该集中,那么我将其添加到另一组副本中。不幸的是,您无法对对象执行相等性检查,因此我首先将元素转换为字符串。我使用Set作为数据结构,因为它们永远不会重复。

然后,在完成所有操作后,我将集合转换为数组并映射到其上以创建原始数组。

const items = [['892','NEW','blue'],
            ['341','USED','red'],
            ['892','NEW','yellow'],
            ['121','USED','blue'],
            ['735','NEW','red'],
            ['121','NEW','blue'],
            ['121','USED','yellow']]
    const duplicates = new Set
    const check = new Set
    items.forEach(([num, status, color]) => {
      let combined = [num, status].join(",")
      if (check.has(combined)) {
        duplicates.add(combined)
      } else {
        check.add(combined)
      }
    })
    const duplicatedArr = Array.from(duplicates).map(strArr => strArr.split(","))
console.log(duplicatedArr)

您可以对数组的相同前两个元素使用哈希表并对其进行计数。如果找到正好两个过滤器该元素。在映射完之后,只映射了前两个元素。

var items = [['892', 'NEW', 'blue'], ['341', 'USED', 'red'], ['892', 'NEW', 'yellow'], ['121', 'USED', 'blue'], ['735', 'NEW', 'red'], ['121', 'NEW', 'blue'], ['121', 'USED', 'yellow']],
    hash = Object.create(null),
    result = items
        .filter(function (a) {
            var key = a.slice(0, 2).join('|');
            hash[key] = (hash[key] || 0) + 1;
            return hash[key] === 2;
        })
        .map(function (a) {
            return a.slice(0, 2);
        });
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

var items = [
  ['892', 'NEW', 'blue'],
  ['341', 'USED', 'red'],
  ['892', 'NEW', 'yellow'],
  ['121', 'USED', 'blue'],
  ['735', 'NEW', 'red'],
  ['121', 'NEW', 'blue'],
  ['121', 'USED', 'yellow']
];
var out = [];
for (i = 0; i < items.length; i++) {
  for (j = i + 1; j < items.length; j++) {
    if (items[i][0] === items[j][0] && items[i][1] === items[j][1]) {
      out.push([items[i][0], items[i][1]]);
    }
  }
}
console.log(out);

最新更新