通过slug或标签搜索数组 - javascript

时间:2016-10-16 07:30:56

标签: javascript

我有一个像下面这样的json对象

items: [
 {
   "slug":"foo",
   "tags":[
           {"value":"bar"},
           {"value":"baz"}
          ]
 },
 {
   "slug":"bar",
   "tags":[]
 }

]

我正在尝试编写一个函数,我可以通过提供的slugtags来搜索集合。所以,如果我搜索" 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。

由于

2 个答案:

答案 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);