我有一个相当简单的对象嵌套数组。每个对象由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"&这个'&'这个。
在我代码的其他部分中,我使用以下内容来处理数组:
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针在堆栈中,并过滤掉不符合所有三个的堆栈