Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 如何在具有多个条件(JS,React)的JSON上使用.filter()和.includes()方法?_Javascript_Arrays_Reactjs - Fatal编程技术网

Javascript 如何在具有多个条件(JS,React)的JSON上使用.filter()和.includes()方法?

Javascript 如何在具有多个条件(JS,React)的JSON上使用.filter()和.includes()方法?,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,抱歉,如果有一个简单的答案,因为我是新的编程。我正在尝试构建一个web应用程序,该应用程序根据关键字筛选一组引用。我选择了一些用JSON格式化的引号,下面是一个片段: [ { "description": "quote 1", "source": "source a", "keywords": ["filter1"] }, { "description": "quote 2", "source": "sour

抱歉,如果有一个简单的答案,因为我是新的编程。我正在尝试构建一个web应用程序,该应用程序根据关键字筛选一组引用。我选择了一些用JSON格式化的引号,下面是一个片段:

  [
    {
      "description": "quote 1",
      "source": "source a",
      "keywords": ["filter1"]
    },
    {
      "description": "quote 2",
      "source": "source b",
      "keywords": ["filter1", "filter2"]
    },
]
我当前执行筛选的代码如下所示:

quotes.filter((el) => el.keywords.includes(...usersKeywords));
quotes
是上面的JSON数据,
usersKeywords
是用户选择的关键字数组(作为字符串)作为过滤器

目前,我的代码成功地过滤JSON以返回引号,只要它至少包含一个关键字。也就是说,只要选择了“filter1”或“filter”,就会包括“quote 2”。理想情况下,我只希望一个报价出现,如果它的所有关键字都被选中

如何更改过滤器,以便所有关键字必须存在才能返回报价

试试下面的方法:

quotes.filter((el) => userKeywords.every(key_word => el.keywords.includes(key_word)));
这将检查userKeywords中的所有元素是否都存在于quote元素的关键字中。

您需要使用测试每个用户关键字

const引号=[
{
描述:“引用1”,
来源:“来源a”,
关键词:['filter1'],
},
{
说明:“报价单2”,
来源:“来源b”,
关键词:['filter1','filter2'],
},
];
常量usersKeywords=['filter2','filter1'];
const result=quotes.filter(q=>usersKeywords.every(k=>q.keywords.includes(k));

控制台日志(结果)在当前代码中,只检查引号的关键字数组中是否存在usersKeywords的第一个元素。如果quotes的任何关键字数组元素在userKeywords第一个元素中不存在,则可能会出现错误。在这种情况下,根据下面的代码,您不会得到预期的结果

quotes.filter((el) => el.keywords.includes(...usersKeywords));
根据您的问题,如果您希望在选中所有关键字的情况下显示一个引号,那么您应该对usersKeywords数组应用该方法。 像下面这样

const quotes = [
    {
      "description": "quote 1",
      "source": "source a",
      "keywords": ["filter1"]
    },
    {
      "description": "quote 2",
      "source": "source b",
      "keywords": ["filter1", "filter2"]
    },
];
const usersKeywords = ["filter1", "filter2"];
const res = quotes.filter(q => usersKeywords.every(key => q.keywords.includes(key)));
console.log(res);

尝试使用
.every()
指示每个
el.keywords
应在
usersKeywords
中找到:
quotes.filter((el)=>el.keywords.every(kw=>usersKeywords.includes(kw))
或者您的意思是每个
用户关键字必须出现在当前
el.keywords
quotes.filter((el)=>userKeywords.every(kw=>el.keywords.includes(kw))@slappy似乎是对的。你能把它作为一个答案吗?@LudovitMydla:这是我目前无法承担的责任。这次我让别人来承担这个负担。谢谢你的帮助!现在看来很明显,所以我很感谢大家的支持,这很有魅力。