如何在JS中匹配嵌套数组中的重复值

How to match duplicate values in nested arrays in JS

提问人:Jaquarh 提问时间:3/18/2022 更新时间:3/18/2022 访问量:726

问:

我有一个数组,其中包含动态创建的嵌套数组,它看起来像这样:

[['1', '2'],['1','3', '4'],['1', '3']]

我正在尝试通过仅从这些数组中获取重复值来实现 AND 逻辑。我在这里的预期输出是,因为所有嵌套数组都必须包含相同的值。['1']

// [['1', '2'],['1','3', '4'],['1', '3']]
const arrays = [...new Set(response)].filter(newSet => newSet.length > 0);

const builder = []; // array of all the id's no longer needed

// [[],[],[]]
arrays.forEach(arr => {
    // []
    arr.forEach(value => {
        // [[], [], []]
        const found = arrays.filter(a => a.find(v => v === value));

        if (found.length === 0)
            builder.push(value);
        });
});

console.log(builder); // empty []

这给了我一个空数组,因为 .我怎样才能返回所有(在这种情况下为 3 个,但可能更多)数组包含的值数组?filter()

上述输入的预期输出为 。任何帮助表示赞赏。["1"]

JavaScript jQuery 数组 嵌套

评论


答:

1赞 cmgchess 3/18/2022 #1

据我了解,您需要所有数组中的通用元素

let response1 = [['1', '2'],['1','3', '4'],['1', '3']]
let response2 = [['1', '2', '3'],['1','3', '4'],['1', '3']]


const getCommon = res => [...new Set(res.flat())].filter(a => res.every(c => c.includes(a)));

console.log(getCommon(response1))
console.log(getCommon(response2))

更新显然,集合转换是不必要的,因为无论如何它必须给出每个数组共有的元素,因此应该进行过滤res[0]

let response1 = [['1', '2'],['1','3', '4'],['1', '3']]
let response2 = [['1', '2', '3'],['1','3', '4'],['1', '3']]


const getCommon = res => res[0].filter(a => res.every(c => c.includes(a)));

console.log(getCommon(response1))
console.log(getCommon(response2))

评论

1赞 cmgchess 3/18/2022
@Jaquarh显然不需要集合转换。只需取第一个元素即可。因为无论如何,它必须给出所有数组中的共同点
1赞 Kamar 3/18/2022 #2

您可以创建一个包含每个数字频率的 count 对象,只需检查一个数字的频率是否等于原始数组的长度。

const getIntersectVals = (arrayOfVals)=>{
  const freqs = {};

  for(let arr of arrayOfVals){
    for(let val of arr){
        if(freqs[val]) freqs[val]++;
        else freqs[val] = 1;
    }
  }
  const uniqueVals = Object.keys(freqs);
  const correctVals = uniqueVals.filter(elem=>{
    return freqs[elem] === arrayOfVals.length;
  })
  return correctVals;
}


const arrayOfVals = [['1', '2'],['1','3', '4'],['1', '3']];

console.log(getIntersectVals(arrayOfVals))

1赞 A1exandr Belan 3/18/2022 #3

Lodash intesection,如果你不介意的话

const arrayOfVals = [['1', '2'],['1','3', '4'],['1', '3']];

const result = _.intersection(...arrayOfVals);

console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

评论

0赞 Jaquarh 3/19/2022
谢谢!有趣的是,看到它被称为十字路口