让我说我有数组1
const arr1 = [[45, 63],[89],[90]]
和数组2
const arr2 = [45, 63]
要检查arr2或arr2中的值是否存在于arr1中,它可以轻松完成下一个功能
private contains(arr1, opts) {
const stringifiedOpts = JSON.stringify(opts);
return arr1.some(item => JSON.stringify(item) === stringifiedOpts);
}
在这种情况下contains()函数将返回true。
这是第一个最简单的案例。 现在让我们说:
arr2 = [45, 63, 90]
function contains()将返回false,因为arr1不包含[45,63,90]但包含[90]作为不同的数组。在这种情况下,函数应返回true,因为arr1中存在90来自arr1
我的问题是,我应该在该函数中使用什么样的逻辑来返回true:
arr2 = [45,63,90] 或
arr2 = [45,90] 或
arr2 = [63,89] 或
arr2 = [63,90] 或
arr2 = [81,20,90] 或
arr2 = [25,60,89]
因为arr1中存在90或89,但是作为不同的数组
欢迎任何帮助/想法/解决方案。谢谢!
答案 0 :(得分:2)
这似乎有效:
arr1
.map(arr => arr.join())
.some(arr => arr2.join().includes(arr))
答案 1 :(得分:1)
这是一个没有展平的版本来保持结构,它基本上检查arr1中的每个块是否符合arr2。
const arr1 = [[45, 63],[89],[90]];
function contains(arr, opts) {
for(let i=0; i<arr.length; i++) {
let innerArray = arr[i];
let isThisBlockOk = true;
for(let j=0; j<innerArray.length; j++) {
if(opts.indexOf(innerArray[j]) === -1) {
isThisBlockOk = false;
break;
}
}
if(isThisBlockOk) return true;
}
return false;
}
const listOfArr2 = [
[45, 63],
[45, 63, 90],
[45, 63, 90],
[45, 90],
[63, 89],
[63, 90],
[81, 20, 90],
[25, 60, 89],
[45, 64, 91],
[45]
];
listOfArr2.forEach(arr2 => {
console.log(JSON.stringify(arr2) + ' contains return: '+ contains(arr1, arr2));
});
答案 2 :(得分:0)
const arr1 = [
[45, 63],
[89],
[90]
]
document.write(custom_contains_any(arr1, [63, 88]))
document.write('<br>')
document.write(custom_contains_all(arr1, [63, 90]))
function custom_contains_any(source, search) {
const s1 = flaten(source)
const s2 = flaten(search)
return s2.filter((x) => s1.includes(x)).length
}
function custom_contains_all(source, search) {
const s1 = flaten(source)
const s2 = flaten(search)
return s2.every((x) => s1.includes(x))
}
function flaten(arr) {
let rtn = []
arr.forEach((x) => {
if (Array.isArray(x)) {
rtn = [...rtn, ...flaten(x)]
return
}
rtn = [...rtn, x]
})
return rtn
}
&#13;