Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态筛选对象数组_Javascript_Arrays_Filter - Fatal编程技术网

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{ if Array.isArrayobj[字段]{ 返回hasMatchesobj[字段],值 }否则{ 返回值。includeObj[字段] } } } 返回人员匹配 } 函数hasMatchesarr1,条件{ let criteriaSet=新的Setcriteria 让personset=newsetarr1 对于标准集的let-el{ if!personset.hasel返回false } 返回真值
}不,这不起作用。只有这个应该是可见的。我需要检查位置字段中的两个值。{颜色:'Silver',位置:['Up','Down']}啊,这样更容易。除了比较数组之外,这并不是非常简单。@Niels-Bom这很简单,数组也需要排序。对,我在回答中使用了include。可以对数组进行预排序以提高速度,但这里似乎并不需要这样做,因为标准数量很少。您好,这段代码没有给出所需的输出。只有此记录应显示为输出:{Color:'Silver',Location:['Up','Down']}在条件中,Location的Up和Down值应匹配。所以输出中应该只有一条记录,它不工作。检查此链接:。我仍得到2条记录。筛选器中的所有值都应与记录匹配。如果在筛选器中有多个值,则记录也应包含所有这些值。好的,您又不清楚了。上面的意思是过滤器的数组应该是person元素的子集。你查过我给你的链接了吗?这暗示了你的最终答案似乎你是新加入社区的,如果你第一次不能正确地问这个问题也没关系。请从下一次开始使您的问题更加简洁,在这一次中,将输出替换为:为避免混淆,输出应为:如果您发现以下答案之一有效,请接受它,以便其他人知道该问题存在有效的解决方案