动态构建表达式以过滤 Javascript 数组
Dynamically build expression to filter Javascript array
我需要根据另一个数组中可变数量的项目过滤一个数组。
假设我要过滤的数组如下所示:
var toBeFiltered = [
{name:"A", parentId: 0},
{name: "B", parentId: 3},
{name: "C", parentId: 0},
{name: "D", parentId: 1},
...
]
我需要过滤 parentId
在另一个数组中的所有元素(比如:var filtering = [3,1,0]
,但它可以有任何长度)。
如何根据 filtering
数组的内容动态构建过滤器表达式?在这种情况下,我会得到这个表达式:
function(d){return d.parentId == 3 || d.parentId == 1 || d.parentId == 0;}
有什么聪明的方法可以做到这一点吗?类似于布尔表达式的串联 ?
您可以使用 indexOf
方法检查给定 array
中是否存在 item
。
indexOf
方法 returns 指定值的第一次出现和 returns -1
如果未找到 value
。
var toBeFiltered = [
{name:"A", parentId: 0},
{name: "B", parentId: 3},
{name: "C", parentId: 0},
{name: "D", parentId: 1},
{name: "E", parentId: 4}
]
var filtering = [3,1,0];
toBeFiltered=toBeFiltered.filter(a=>filtering.indexOf(a.parentId)!==-1);
console.log(toBeFiltered);
您还可以使用 ES6
中的 Set
功能。
var toBeFiltered = [
{name:"A", parentId: 0},
{name: "B", parentId: 3},
{name: "C", parentId: 0},
{name: "D", parentId: 1},
{name: "E", parentId: 4}
]
var filtering = new Set([3,1,0]);
toBeFiltered=toBeFiltered.filter(a=>filtering.has(a.parentId));
console.log(toBeFiltered);
var toBeFiltered = [{ name:"A", parentId: 0 }, { name: "B", parentId: 3 }, { name: "C", parentId: 0 }, { name: "D", parentId: 1 }],
filtering = [1, 0], // to prevent to get the same array as the original
result = toBeFiltered.filter(o => filtering.includes(o.parentId));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我需要根据另一个数组中可变数量的项目过滤一个数组。 假设我要过滤的数组如下所示:
var toBeFiltered = [
{name:"A", parentId: 0},
{name: "B", parentId: 3},
{name: "C", parentId: 0},
{name: "D", parentId: 1},
...
]
我需要过滤 parentId
在另一个数组中的所有元素(比如:var filtering = [3,1,0]
,但它可以有任何长度)。
如何根据 filtering
数组的内容动态构建过滤器表达式?在这种情况下,我会得到这个表达式:
function(d){return d.parentId == 3 || d.parentId == 1 || d.parentId == 0;}
有什么聪明的方法可以做到这一点吗?类似于布尔表达式的串联 ?
您可以使用 indexOf
方法检查给定 array
中是否存在 item
。
indexOf
方法 returns 指定值的第一次出现和 returns -1
如果未找到 value
。
var toBeFiltered = [
{name:"A", parentId: 0},
{name: "B", parentId: 3},
{name: "C", parentId: 0},
{name: "D", parentId: 1},
{name: "E", parentId: 4}
]
var filtering = [3,1,0];
toBeFiltered=toBeFiltered.filter(a=>filtering.indexOf(a.parentId)!==-1);
console.log(toBeFiltered);
您还可以使用 ES6
中的 Set
功能。
var toBeFiltered = [
{name:"A", parentId: 0},
{name: "B", parentId: 3},
{name: "C", parentId: 0},
{name: "D", parentId: 1},
{name: "E", parentId: 4}
]
var filtering = new Set([3,1,0]);
toBeFiltered=toBeFiltered.filter(a=>filtering.has(a.parentId));
console.log(toBeFiltered);
var toBeFiltered = [{ name:"A", parentId: 0 }, { name: "B", parentId: 3 }, { name: "C", parentId: 0 }, { name: "D", parentId: 1 }],
filtering = [1, 0], // to prevent to get the same array as the original
result = toBeFiltered.filter(o => filtering.includes(o.parentId));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }