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

Fastest way to find if an array of object contains one of the tags

本文关键字:一个 方法 是否 数组 对象 包含其 查找      更新时间:2023-09-26

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

let item = {
    tags: [String],
    name: String
};
let queue = [item1, item2, ...];

我想知道查找包含特定tag(s)的所有项目。对于循环,蛮力为2:

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)更好的方法吗?

使用Set或仅使用Object来存储标记,这样就不需要迭代标记数组来搜索标记。

使用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];
    });
});

我想为getFirstgetAll函数实现一个。

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>");