通过搜索嵌套对象属性过滤对象数组

IT技术 javascript arrays object filter
2021-03-12 13:03:24

我有一个对象数组,我想通过将嵌套属性与搜索词进行比较来过滤这些对象。

例如:

 var array = [
      {category: 'Business'
       users: [
                {name: 'Sally'
                 tags: [{tag: 'accounting'}, {tag: 'marketing'},...]
                },
                {name: 'Bob'
                 tags: [{tag: 'sales'}, {tag: 'accounting'},...]
                }...
              ]
       },
       {category: 'Heritage'
        users: [
                 {name: 'Linda'
                  tags: [{tag: 'Italy'}, {tag: 'Macedonia'},...]
                 },
                 {name: 'George'
                  tags: [{tag: 'South Africa'}, {tag: 'Chile'},...]
                 },...
               ]
       },...
    [

本质上,我想通过搜索词过滤对象的基本数组,该搜索词包括嵌套对象 2 数组中标记属性字符串中的字符。

所以搜索“市场”会导致

[
  {category: 'Business'
   users: [
            {name: 'Sally'
             tags: [{tag: 'accounting'}, {tag: 'marketing'},...]
            },
            {name: 'Bob'
             tags: [{tag: 'sales'}, {tag: 'accounting'},...]
            }...
          ]
   }
]

谢谢你。

6个回答

您可以通过使用Array#filter来查看嵌套数组Array#some

如果在嵌套数组中找到标记,则迭代停止并将结果返回给过滤器回调。

var array = [{ category: 'Business', users: [{ name: 'Sally', tags: [{ tag: 'accounting' }, { tag: 'marketing' }] }, { name: 'Bob', tags: [{ tag: 'sales' }, { tag: 'accounting' }] }] }, { category: 'Heritage', users: [{ name: 'Linda', tags: [{ tag: 'Italy' }, { tag: 'Macedonia' }] }, { name: 'George', tags: [{ tag: 'South Africa' }, { tag: 'Chile' }] }] }],
    tag = 'marketing',
    result = array.filter(a => a.users.some(u => u.tags.some(t => t.tag.includes(tag))));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果我想比较两个值?
2021-05-05 13:03:24

使用Array.prototype.some()函数的解决方案

var arr = [{ category: 'Business', users: [{ name: 'Sally', tags: [{ tag: 'accounting' }, { tag: 'marketing' }] }, { name: 'Bob', tags: [{ tag: 'sales' }, { tag: 'accounting' }] }] }, { category: 'Heritage', users: [{ name: 'Linda', tags: [{ tag: 'Italy' }, { tag: 'Macedonia' }] }, { name: 'George', tags: [{ tag: 'South Africa' }, { tag: 'Chile' }] }] }], 
    search_key = 'market',
    result = [];
    
arr.forEach(function(o){
    if (o.users.some(function(v){
        return v.tags.some(function(i){ return i.tag.indexOf(search_key) !== -1; });
    })) {
        result.push(o);
    }
});

console.log(result);

这是一个很好的答案罗马,谢谢。我刚刚接受了 Nina 的,因为她是先添加的,而且更简洁一些。做得好。
2021-04-22 13:03:24

试试这个:

function search(term){
return
    Array.filter(array,function(item){
       return JSON.stringify(obj).indexOf(term)!=-1;
    });
}

所以 :

console.log(search('market'));

希望对你有帮助:)

这也会搜索键,因此如果您搜索“标签”,您会发现每个对象都匹配。
2021-05-20 13:03:24

concatAllconcatMap定义取自http://reactivex.io/learnrx/

Array.prototype.concatAll = function() {
    var results = [];
    this.forEach(function(subArray) {
        results.push.apply(results, subArray);
    });

    return results;
};

Array.prototype.concatMap = function(projectionFunctionThatReturnsArray) {
    return this.
        map(function(item) {
            return projectionFunctionThatReturnsArray(item);
        }).
        // apply the concatAll function to flatten the two-dimensional array
        concatAll();
};

function filterByTags(keyword) {
  return array.filter(function (item) {
    var allTags = item.users.concatMap(function (user) {
      return user.tags.map(function (tag) {
        return tag.tag;
      });
    });

    return allTags.some(function (tag) {
      return tag.indexOf(keyword) > -1;
    });
  });
}

console.log(filterByTags('market'));

当然,allTags为了更简洁,您可以内联变量。

filter应用于初始阵列将返回有用户,其标签中包含所提供的关键字的所有项目。该策略是构建用户标签的扁平版本并应用some到该版本上。

你可以这样使用array.filter

function getFiltered(val) {
     return array.filter(category == val);
}

此函数将返回一个新的数组实例,仅使用category您作为val参数传递