gpt4 book ai didi

javascript - 按标签过滤对象(对象数组中的数组)

转载 作者:行者123 更新时间:2023-11-30 11:15:55 24 4
gpt4 key购买 nike

目标

编辑 - 使问题更清楚

创建一个可以根据项目的标签缩小搜索结果范围的搜索,并且只返回具有指定标签的项目。示例:['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']如果我选择 greenbig 它输出 ['green', 'big']

如果我选择标签 green 我应该得到这些结果

{ title: 'prod1', tags: [{ value: 'green' }, { value: 'big' }] },
{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },

如果我选择标签 greenmedium 我会得到这些结果,因为 prod4 是唯一一个有标签 green 和 medium

{ title: 'prod4', tags: [{ value: 'green' }, { value: 'big' }, { value: 'medium' }] },

如果我选择greenbig 我应该得到

{ 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com