Javascript 过滤嵌套数组以排除不包含多个元素之一的对象



我有一个相当简单的对象嵌套数组。每个对象由5个(字符串(值组成,例如["0,0","0,","0,0","0.0","0,1"]。没有附加任何变量,因此在数组中使用数组。

每个对象都代表一个解谜排列,由我的代码的其他部分测试。主数据集由150k个排列组成。

let haystack = [
["1,0", "0,0", "0,0", "0,0", "0,0"],
["0,0", "0,2", "0,0", "0,0", "0,1"],
["2,2", "0,0", "4,2", "0,2", "1,1"],
["0,0", "0,0", "3,0", "0,0", "2,1"],
["0,0", "0,0", "0,0", "0,0", "2,2"],
["0,0", "0,2", "0,0", "0,0", "3,2"],
["0,0", "0,0", "0,1", "0,0", "0,3"],
["0,0", "0,1", "0,0", "1,0", "3,0"],
["0,1", "0,0", "4,2", "1,0", "2,1"],
["0,3", "0,0", "0,1", "0,0", "3,2"],
["0,0", "3,2", "0,0", "1,0", "0,2"],
["0,0", "1,0", "0,0", "1,0", "4,2"],
["0,0", "0,0", "0,0", "1,0", "2,2"],
["0,0", "0,0", "0,0", "1,0", "3,2"],
["0,2", "3,2", "0,1", "1,0", "0,1"]]

我想过滤这个"干草堆",但数组中的每个对象都必须通过3个过滤器(针刺1、针刺2、针刺3(:

let needle1 = haystacks[i].includes("0,1" || "3,0" || "3,2" || "4,2");
let needle2 = haystacks[i].includes("1,0" || "2,0" || "1,2" || "2,2");
let needle3 = haystacks[i].includes("0,0" || "3,2");

如果它未通过任何单个过滤器,则不应将其转移到新阵列。

所以这行:

["0,0", "0,0", "0,0", "0,0", "2,2"],

将通过针3过滤器而不通过针1过滤器。

新数组将只包括旧数组中通过所有三个测试的对象。

newHaystack = [
["2,2", "0,0", "4,2", "0,2", "1,1"],
["0,0", "0,1", "0,0", "1,0", "3,0"],
["0,1", "0,0", "4,2", "1,0", "2,1"],
["0,0", "3,2", "0,0", "1,0", "0,2"],
["0,0", "1,0", "0,0", "1,0", "4,2"],
["0,0", "0,0", "0,0", "1,0", "3,2"],
["0,2", "3,2", "0,1", "1,0", "0,1"]];

我发现了一种代码,它可以过滤存在的许多元素中的任何一个,而不考虑位置:

let needle1 = ["4,2", "0,0", "2,1"];
const haystack2 = haystack.filter(item =>
needle1.every(val => item.indexOf(val) > -1));

将返回:

[["0,1";,"0,0";,"4,2〃;,"1,0";,"2,1〃;]]

但这并不是我想要的。我想要"this"、"this"或"this",而不是"this"&amp这个'&'这个。

在我代码的其他部分中,我使用以下内容来处理数组:

let needle1 = haystacks[i].includes("0,1" || "3,0" || "3,2" || "4,2");

然后在主循环中,我简单地跳过了这个对象。

if (needle1 !== true) {skipObject(); return;}
if (needle2 !== true) {skipObject(); return;}
if (needle3 !== true) {skipObject(); return;}

但是javascript文件目前已经超过了10MB的限制,有这么大的排列数据集,我的目标是精简我知道不起作用的排列数组。

任何关于解决方案的提示都是有用的。

测试了@Ethan_Snow的这个建议,但它向数组输出了15个对象,而不是7个。

let needle1 = ["0,1", "3,0", "3,2", "4,2"];
let needle2 = ["1,0", "2,0", "1,2", "2,2"];
let needle3 = ["0,0", "3,2"];
let needles = [needle1, needle2, needle3];
const haystack2 = haystack.filter(stack => {
return needles.every(needles => {return needles.some(item => stack.includes(item) > -1)
})
})
console.log(haystack2);

如果我正确理解你的问题,你可以使用filter和Array.some,并检查它是否满足每个针的

let needle1 = ["0,1", "3,0", "3,2",  "4,2"];
let needle2 = ["1,0", "2,0", "1,2", "2,2"];
let needle3 = ["0,0", "3,2"];
let needles = [needle1, needle2, needle3]
const haystack2 = haystack.filter(stack => {
return needles.every(needle => {
return needle.some(item => stack.includes(item)
}); 
})
console.log(haystack2);

这应该检查每个";"针";in针在堆栈中,并过滤掉不符合所有三个的堆栈

最新更新