我有一个像下面这样的json对象
items: [
{
"slug":"foo",
"tags":[
{"value":"bar"},
{"value":"baz"}
]
},
{
"slug":"bar",
"tags":[]
}
]
我正在尝试编写一个函数,我可以通过提供的slug
或tags
来搜索集合。所以,如果我搜索" bar" ,应该找到两个对象。如果我搜索" baz" - 只返回第一个对象等
这是我到目前为止所拥有的,
items = items.filter((item) => {
var regex = new RegExp( searchTerm, 'g' );
if (item.slug.match(regex)){
return true
}
item.tags.map((tag) => {
if (tag.title.match(regex)){
console.log('item found : ',item)
return true
}
})
})
searchTerm
是提供的搜索字符串。
以上代码似乎只返回slug
匹配的项目,但标签似乎不起作用。我假设问题是内部映射函数不会返回过滤函数吗?
上述方法的正确方法是什么?我宁愿使用普通的js。
由于
答案 0 :(得分:0)
您通过items
重新定义items = items.filter((item)
来覆盖原始数组。
您还在搜索tag.title
而不是tag.value
; items.tags
数组在问题"tilte"
处没有属性为javascript
的对象元素。
使用.some()
代替.map()
; .map()
返回一个新数组,.some()
返回Boolean
。
items = [
{
"slug":"foo",
"tags":[
{"value":"bar"},
{"value":"baz"}
]
},
{
"slug":"bar",
"tags":[]
}
];
var searchTerm = "baz";
var res = items.filter((item) => {
var regex = new RegExp( searchTerm, 'g' );
if (item.slug.match(regex)){
return true
}
return item.tags.some((tag) => {
if (tag.value.match(regex)){
console.log('item found : ',item)
return true
}
})
})
console.log(res)

答案 1 :(得分:0)
或者只是:
var items = [
{
"slug":"foo",
"tags":[
{"value":"bar"},
{"value":"baz"}
]
},
{
"slug":"bar",
"tags":[]
}
];
var searchTerm = "baz";
var regex = new RegExp( searchTerm, 'g');
results = items.filter(item => (item.slug.match(regex) || item.tags.some(tag => tag.value.match(regex))));
console.log(results);