在多维数组中搜索字符串重复项

时间:2019-02-12 14:32:41

标签: javascript arrays sorting

我有带字符串的多维数组:

const arr = [['a', 'b'], ['c', 'd'], ['d', 'a']]

如何记录所有嵌套数组中超过1次的所有值? (对于此示例功能,应该console.log'a'和'd')。

感谢您的帮助

5 个答案:

答案 0 :(得分:4)

您首先将arr展平,然后使用 Set 从其中删除重复项。然后遍历它,然后比较lastIndexOfindexOf

const arr = [['a', 'b'], ['c', 'd'], ['d', 'a']]
let flat = arr.toString().split(',');
[... new Set(flat)].forEach(a => {
  if(flat.indexOf(a) !== flat.lastIndexOf(a)) console.log(a)
})

答案 1 :(得分:3)

let findDupesInMDArray = (arr) => {
  // flatten the array
  const flat = arr.flat();
  // filter for dupes
  return flat.filter((item, index) => flat.indexOf(item) != index)
}

let array = [['a', 'b'], ['c', 'd'], ['d', 'a']]
const dupes = findDupesInMDArray(array)
console.log(dupes)

答案 2 :(得分:1)

使用扩展语法,Array#flat,Array#reduce,Array#filter和Array#map。

const arr = [['a', 'b'], ['c', 'd'], ['d', 'a']]

const res = Array.from(arr.flat().reduce((a,c)=>{
  return a.set(c, (a.get(c)||0) + 1);
}, new Map()))
.filter(([,c])=> c > 1)
.map(([k])=>k);

console.log(res);

答案 3 :(得分:0)

您可以使用Map对项目进行计数,而只获得计数大于1的项目。

const 
    count = (m, a) => Array.isArray(a) ? a.reduce(count, m) : m.set(a, (m.get(a) || 0) + 1);

var array = [['a', 'b'], ['c', 'd'], ['d', 'a']],
    result = Array
        .from(array.reduce(count, new Map), ([k, v]) => v > 1 && k)
        .filter(Boolean)
    
console.log(result);

答案 4 :(得分:0)

这是一种更基本的方法:

var array = [['a', 'b'], ['c', 'd'], ['d', 'a']]
  var result = [];
  for (var i in array){
   for (var l in array[i]){
    if(array[i][l]==='a'||array[i][l]==='d')
      result.push(array[i][l])
}}

var unique = new Set(result) //creates a set with unique values
console.log(unique) //should log the set {'a','d'}

我们在这里做的是

  1. 两次遍历嵌套数组
  2. 将元素(如果元素==='a'或元素==='d')推入名为result的新数组中。
  3. 仅使用唯一值创建新集