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

标签 javascript arrays object filter

目标

编辑 - 使问题更清楚

创建一个可以根据项目的标签缩小搜索结果范围的搜索,并且只返回具有指定标签的项目。 示例:['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/

相关文章:

javascript - ajax 调用成功但没有返回数据

javascript - 如何在 gulp-rename 和 gulp-uglify 上的相同路径或目标中创建 min 文件?

arrays - 在 Alamofire 中发布参数

arrays - 使用 Array.map 在字典数组中搜索

javascript - 如何在 jstree 更改事件中获取更改项目的 id

r - 在 R 中创建空对象

javascript - 如何使用 JavaScript 在页面上一次显示 1 个表单

javascript - 在 HTA 应用程序中使用 JQUERY 读取 JSON 文件

c++ - 在字节数组上转换具有虚函数的结构是否安全?

php - 取消设置变量属性上的数组