在另一个数组中过滤数组

时间:2019-12-16 18:16:19

标签: javascript arrays sorting

    const data = [
    {
        id: 1,
        title: "stuffed chicken is tasty as anything",
        picture: "./img/chicken.jpg",
        tags: ["oooo", "tasty", "stuffed"]
    },
    {
        id: 2,
        title: "noodles with shrimp and salad",
        picture: "./img.ramen.jpg",
        tags: ["noodles", "shrimp", "salad"]
    },
    {
        id: 3,
        title: "oooooooooooooooooooooooo",
        picture: "oooooooooooooooooooo",
        tags: ["oooo", "xxxx", "qqqq"]
    }
    ];

所以我需要从数组中找到匹配的title:和tags:。在下面,我显示了如何进行标题制作。

let matches = data.filter(el => {
 return el.title.match(regex);
}

但是我该如何在标签上这样做呢?我可以做:

return el.tags[0].match(regex) || el.tags[1].match(regex);

但是如果还有更多标签怎么办?我试图遍历它并匹配正则表达式,但是我得到了空对象。

return el.tags.forEach(it => it.match(regex));

3 个答案:

答案 0 :(得分:0)

您可以在JavaScript中使用数组的every函数。仅当所有数组元素都满足条件时,它才会返回true。

return el.tags.every(it => it.match(regex));

答案 1 :(得分:0)

我认为您只是在使用正则表达式进行搜索,在这种情况下,您可以仅使用Array.prototype.some()Array.prototype.every()搜索标签。

赞:

let matches = data.filter(e => e.title.match(regex) && e.tags.some(t => t.match(regex));
// --
let matches = data.filter(e => e.title.match(regex) && e.tags.every(t => t.match(regex));

鉴于它们是标签而不是完整标题,我建议使用some函数。从语义上讲,我认为这更有意义。选择了1/4个标签后,您就不想隐藏它们。

答案 2 :(得分:0)

使用双管道||发布后,应该使用函数Array.prototype.some来计算谓词(即处理程序),如果至少一个元素满足条件,则返回true。

此外,您应该改为使用函数test

const data = [{    id: 1,    title: "stuffed chicken is tasty as anything",    picture: "./img/chicken.jpg",    tags: ["oooo", "tasty", "stuffed"]  },  {    id: 2,    title: "noodles with shrimp and salad",    picture: "./img.ramen.jpg",    tags: ["noodles", "shrimp", "salad"]  },  {    id: 3,    title: "oooooooooooooooooooooooo",    picture: "oooooooooooooooooooo",    tags: ["oooo", "xxxx", "qqqq"]  }];

let regex = new RegExp("[oo]");
let matches = data.filter(({title, tags}) => regex.test(title) || tags.some(t => regex.test(t)));
console.log(matches);
.as-console-wrapper { max-height: 100% !important; top: 0; }