我有一个对象数组,每个对象都包含一个包含字符串数组的属性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)
更好的方式?
答案 0 :(得分:3)
使用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];
});
});
答案 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;