根据第一个位置的字符串长度删除数组数组中的重复项。 JS

时间:2021-01-27 13:58:31

标签: javascript arrays duplicates

我有一个这样的数组:

arr = 
[
  [0 ,  abc  ],
  [7 ,  def  ],
  [10,  ghi  ],
  [0 , abcjkl]
]

我想要的是根据第 0 个位置的值(在我的示例中:[0, abc], [0, abcjkl])找到重复项,并删除第 1 个位置上具有较短字符串的数组。结果应该是这样的:

[
  [7 ,  def  ],
  [10,  ghi  ],
  [0 , abcjkl]
]

感谢您的帮助。

编辑:

我的工作算法似乎不是最好的方法。

function findDupes(arr) {
  let dupe = null;
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (arr[i] !== arr[j]) {
        if (arr[i][1] === arr[j][1]) {
          if (arr[i][0].length >= arr[j][0].length) {
            dupe = arr[j];
          } else {
            dupe = arr[i];
          }
        }
      }
    }
  }
  return dupe;
}

let check = findDupes(arr);
while (check) {
    filteredValues.splice(arr.indexOf(check), 1);
    check = findDupes(arr);
}

2 个答案:

答案 0 :(得分:0)

您可以使用哈希映射来解决这个问题。循环遍历每个内部数组并将元素放入哈希映射中,例如 let hashMap = {0:'abc',10:'ghi'}。

如果key已经存在于hash Map中,检查该值的长度是否小于新值,如果是,则替换。

答案 1 :(得分:0)

将数组缩减为Map,当发现长度更大的重复项时,删除之前的并添加新的:

const data = [
  [0 ,  'abc'  ],
  [7 ,  'def'  ],
  [10,  'ghi'  ],
  [0 , 'abcjkl']
]

const result = Array.from(
 data.reduce((acc, row) => {
  const [key, value] = row
 
  if(value.length > (acc.get(key)?.length ?? 0)) {
    acc.delete(key)
    acc.set(key, value)
  }
  
  return acc
 } , new Map())
)

console.log(result)