Javascript 动态筛选对象数组
此处字段颜色为字符串类型,位置为数组。 我有人,然后有一个过滤标准。我需要一个输出,以便过滤器中选择的所有值都需要与数据匹配。因此,在提供的数据中,如果记录中有银、上下,则只有这些记录才可见。注意和参数,任何地方都没有或条件 因此,输出将是:Javascript 动态筛选对象数组,javascript,arrays,filter,Javascript,Arrays,Filter,此处字段颜色为字符串类型,位置为数组。 我有人,然后有一个过滤标准。我需要一个输出,以便过滤器中选择的所有值都需要与数据匹配。因此,在提供的数据中,如果记录中有银、上下,则只有这些记录才可见。注意和参数,任何地方都没有或条件 因此,输出将是: var persons = [ { Color: "Gold", Location: ["Down"] }, { Color: "Silver", Location: ["Up", "Down"] }, { Color: "Silver", L
var persons = [
{ Color: "Gold", Location: ["Down"] },
{ Color: "Silver", Location: ["Up", "Down"] },
{ Color: "Silver", Location: ["Up"] }
];
var criteria = [
{ Field: "Color", Values: ["Silver"] },
{ Field: "Location", Values: ["Up", "Down"] }
];
var criteria = [
{ Field: "Color", Values: ["Silver"] },
{ Field: "Location", Values: ["Up"] }
];
现在,如果筛选条件为:
{ Color: "Silver", Location: ["Up", "Down"] }
输出将是:
var persons = [
{ Color: "Gold", Location: ["Down"] },
{ Color: "Silver", Location: ["Up", "Down"] },
{ Color: "Silver", Location: ["Up"] }
];
var criteria = [
{ Field: "Color", Values: ["Silver"] },
{ Field: "Location", Values: ["Up", "Down"] }
];
var criteria = [
{ Field: "Color", Values: ["Silver"] },
{ Field: "Location", Values: ["Up"] }
];
因此,您可以看到筛选器中的所有值都应该与记录匹配。我将问题分解为单独的函数。它比您的解决方案要详细得多,但我确实认为它更具可读性 还有:它确实有效
{ Color: "Silver", Location: ["Up", "Down"] },
{ Color: "Silver", Location: ["Up"] }
请参阅以获取一个运行示例。在第三次编辑之后,现在我清楚地知道您想要的是什么—将一个数组作为另一个数组的子集
var persons = [
{ Color: "Gold", Location: ["Down"] },
{ Color: "Silver", Location: ["Up", "Down"] },
{ Color: "Silver", Location: ["Up"] }
];
var criteria = [
{ Field: "Color", Values: ["Silver"] },
{ Field: "Location", Values: ["Up", "Down"] }
];
const arraysEqual = (arr1, arr2) => {
// Very simple array comparison.
if (arr1.length !== arr2.length) return false;
arr1 = arr1.sort();
arr2 = arr2.sort();
for(let i=0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
};
let result = persons.filter(person => {
// All criteria must match.
for (let criterium of criteria) {
if (criterium.Field === 'Color') {
if (person.Color !== criterium.Values[0]) return false;
}
if (criterium.Field === 'Location') {
if (!arraysEqual(person.Location, criterium.Values)) return false;
}
}
// We didn't *not* match for anything, so we matched!
return true;
});
console.log(result);
/*
{ Color: "Silver", Location: ["Down", "Up"] }
*/
我还更新了您的JSFIDLE:
同时结帐:我相信这是可行的。使用集合对部分匹配有很大帮助。请告诉我您是否需要代码的解释 个人变量=[ {颜色:金色,位置:[向下]}, {颜色:银色,位置:[上,下]}, {颜色:银色,位置:[Up]} ]; 风险值标准=[ {字段:颜色,值:[银色]}, {字段:位置,值:[向上,向下]} ]; console.logmatchperson,标准; 职能、人员、标准{ let personMatches=[…人] 对于let i=0;i
}不,这不起作用。只有这个应该是可见的。我需要检查位置字段中的两个值。{颜色:'Silver',位置:['Up','Down']}啊,这样更容易。除了比较数组之外,这并不是非常简单。@Niels-Bom这很简单,数组也需要排序。对,我在回答中使用了include。可以对数组进行预排序以提高速度,但这里似乎并不需要这样做,因为标准数量很少。您好,这段代码没有给出所需的输出。只有此记录应显示为输出:{Color:'Silver',Location:['Up','Down']}在条件中,Location的Up和Down值应匹配。所以输出中应该只有一条记录,它不工作。检查此链接:。我仍得到2条记录。筛选器中的所有值都应与记录匹配。如果在筛选器中有多个值,则记录也应包含所有这些值。好的,您又不清楚了。上面的意思是过滤器的数组应该是person元素的子集。你查过我给你的链接了吗?这暗示了你的最终答案似乎你是新加入社区的,如果你第一次不能正确地问这个问题也没关系。请从下一次开始使您的问题更加简洁,在这一次中,将输出替换为:为避免混淆,输出应为:如果您发现以下答案之一有效,请接受它,以便其他人知道该问题存在有效的解决方案