查找对象数组是否包含其中一个标记的最快方法

时间:2016-05-09 23:49:26

标签: javascript arrays

我有一个对象数组,每个对象都包含一个包含字符串数组的属性tags

let item = {
    tags: [String],
    name: String
};

let queue = [item1, item2, ...];

我想知道找到包含特定tag(s)的所有项目。蛮力将是2个for-loops:

function findTags(tags) {
    let results = [];
    queue.forEach(function (item) {
        tags.forEach(function (tag) {
            if (item.tags.indexOf(tag) !== -1) {
                results.push(item);
            }
        });
    });

    return results;
}

是否有比O(N^2)更好的方式?

2 个答案:

答案 0 :(得分:3)

使用SetObject来存储代码,这样您就不需要迭代标记数组来搜索代码。

一旦找到匹配项,请使用Array#some停止迭代。

由于您要过滤数组,请使用Array#filter

var tagsObj = Object.create(null);
tags.forEach(function (tag) {
    tagsObj[tag] = true;
});

return queue.filter(function (item) {
    return item.tags.some(function (tag) {
        return tagsObj[tag];
    });
});

答案 1 :(得分:0)

我想为getFirst实现一个,为getAll函数实现一个。



var queue = [
        {    			
        tags: ["tag01","tag02","tag03"],
        name: "name01"
        },
        {
        tags: ["tag04","tag05","tag06"],
        name: "name02"
        },
        {
        tags: ["tag02","tag04","tag06"],
        name: "name03"
        },
        {
        tags: ["tag01","tag03","tag05"],
        name: "name04"
        },
        ],
 getFirst = (...tags) => queue.find( o => tags.some( t => o.tags.includes(t))),
   getAll = (...tags) => queue.reduce((p,o) => tags.some( t => o.tags.includes(t)) ? p.concat(o) : p ,[]);
   
document.write("<pre> Result for getFirst:\n" + JSON.stringify(getFirst("tag04","tag02"),null,2) + "</pre>");
document.write("<pre> Result for getAll:\n" + JSON.stringify(getAll("tag04","tag02"),null,2) + "</pre>");
&#13;
&#13;
&#13;