目标
编辑 - 使问题更清楚
创建一个可以根据项目的标签缩小搜索结果范围的搜索,并且只返回具有指定标签的项目。 示例:['green'] 会给我所有绿色的项目,包括大、中和小(因为没有指定尺寸),['green','big'] 只会给我绿色和大的项目。
我遇到了一个场景。为了简化事情,我有以下数据
items: [
{ title: 'prod1', tags: [{ value: 'green' }, { value: 'big' }] },
{ title: 'prod2', tags: [{ value: 'blue' }, { value: 'small' }] },
{ title: 'prod3', tags: [{ value: 'yellow' }, { value: 'medium' }, { value: 'big' }] },
{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },
]
我的搜索字段是一个多选输入,带有预定义的标签(如本网站中的标签字段)
该字段的值作为数组输出。如果我选择 green
输出是 ['green']
如果我选择 green
和 big
它输出 ['green', 'big']
如果我选择标签 green
我应该得到这些结果
{ title: 'prod1', tags: [{ value: 'green' }, { value: 'big' }] },
{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },
如果我选择标签 green
和 medium
我会得到这些结果,因为 prod4 是唯一一个有标签 green 和 medium
{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },
如果我选择green
和big
我应该得到
{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },
{ title: 'prod1', tags: [{ value: 'green' }, { value: 'big' }] }
如果没有选择,则输出所有项
原始问题
I ran into a scenario. To simplify things, i have the following data
items: [
{title: 'one', desc: 'this is one', tags: [{value: 'mytag'},{value: 'one'}]},
{title: 'two', desc: 'this is two', tags: [{value: 'mytag'},{value: two}]},
{title: 'three', desc: 'this is three', tags: [{value: 'mytag'},{value: 'three'},{value: 'common'}]},
{title: 'four', desc: 'this is four', tags: [{value: 'mytag'},{value: 'four'},{value: 'common'}]},
]
我有一个接受标签的搜索输入元素,输入的值是一个数组。输入的值为 ['tag','two']
我似乎不知道如何按标签过滤我的项目。
如果我按标签二搜索 (['two']
) 我应该得到返回
filteredItems: [
{title: 'two', desc: 'this is two', tags: [{value: 'mytag'},{value: two}]},
]
如果我搜索两个,common (['two','common']
) 我应该得到一个返回值
filteredItems: [
{title: 'three', desc: 'this is three', tags: [{value: 'mytag'},{value: 'three'},{value: 'common'}]},
{title: 'four', desc: 'this is four', tags: [{value: 'mytag'},{value: 'four'},{value: 'common'}]},
]
我尝试查看一些示例,发现一些示例仅过滤顶级项目而不过滤嵌套数组。
谢谢 :) 顺便使用javascript,可以使用lodash。
我的 playground JS 文件:
const _ = require('lodash')
let items = [
{
name: 'hello',
tags: [
{ value: 1 },
{ value: 2 },
]
},
{
name: 'bye',
tags: [
{ value: 2 },
{ value: 4 },
]
}
]
items.map(item =>{
let test = _.includes(item.tags, 2)
console.log(test)
// returns false, false
})
最佳答案
(注意:此答案的第一部分与编辑前的原始问题相关)
您需要更深入一层。您的最终 Playground 代码是将对象与 2 进行比较,但您应该将对象属性 与 2 进行比较。
let test = items.filter(item =>{
return item.tags.some(obj => obj.value === 2)
})
或者,如果要查找的值在其他属性中:
let test = items.filter(item =>{
return item.tags.some(obj => obj.text === 'two')
})
修改您的问题后
您的示例数据可以这样搜索:
function search(items, constraints) {
return items.filter(item =>
constraints.every(constraint =>
item.tags.some(obj => obj.value === constraint)
)
);
}
const items = [
{ title: 'prod1', tags: [{ value: 'green' }, { value: 'big' }] },
{ title: 'prod2', tags: [{ value: 'blue' }, { value: 'small' }] },
{ title: 'prod3', tags: [{ value: 'yellow' }, { value: 'medium' }, { value: 'big' }] },
{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },
];
console.log(search(items, ["green", "medium"]));
您需要的逻辑是 AND 和 OR 逻辑的组合:对于匹配给定约束的数组元素,它应该有 一些 匹配对象 (OR) 每个 给定约束中的值 (AND)。
关于javascript - 按标签过滤对象(对象数组中的数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51564963/