JS中如何匹配嵌套数组中的重复值
How to match duplicate values in nested arrays in JS
我有一个数组,其中包含动态创建的嵌套数组,它看起来像这样:
[['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 []
由于filter()
,这给了我一个空数组。我如何 return 一个所有(在本例中为 3 个,但可以更多)数组包含的值数组?
上述输入的预期输出为 ["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))
你可以创建一个计数对象,其中包含每个数字的频率,只检查数字的频率是否等于原始数组的长度。
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))
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/lodash@4.17.21/lodash.min.js"></script>
我有一个数组,其中包含动态创建的嵌套数组,它看起来像这样:
[['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 []
由于filter()
,这给了我一个空数组。我如何 return 一个所有(在本例中为 3 个,但可以更多)数组包含的值数组?
上述输入的预期输出为 ["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))
你可以创建一个计数对象,其中包含每个数字的频率,只检查数字的频率是否等于原始数组的长度。
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))
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/lodash@4.17.21/lodash.min.js"></script>