首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JS对象值搜索

JS对象值搜索
EN

Stack Overflow用户
提问于 2011-12-15 16:25:02
回答 15查看 234.7K关注 0票数 65

我有一个类似这样的同构对象数组;

代码语言:javascript
复制
[
  {
    "foo" : "bar",
    "bar" : "sit"
  },
  {
    "foo" : "lorem",
    "bar" : "ipsum"
  },
  {
    "foo" : "dolor",
    "bar" : "amet"
  }
]

我想用关键字搜索这些对象的值(而不是键),并返回一个对象数组,这些对象在任何值中都包含关键字。

例如,使用关键字r,我将获得所有对象(对象#1中的“baR”,对象#2中的"loRem“和对象#3中的"doloR”)。使用关键字lo,我将获得对象2和3 ("LOrem“和"doLOr"),使用a,我将获得对象1和3 ("bAr”和"Amet")。然而,使用关键字foo,我会得到一个空数组,因为"foo“是一个键,并且在任何值中都找不到(与”foo“不同)……你明白了吧。

我该怎么做呢?提前谢谢你!

EN

回答 15

Stack Overflow用户

发布于 2016-11-30 22:18:59

所有其他的旧答案都使用for in循环,现代的JavaScript都有Object.keys。将它与一些、包含和过滤器结合起来,它会更好一些。

代码语言:javascript
复制
var a = [{
  name: 'xyz',
  grade: 'x'
}, {
  name: 'yaya',
  grade: 'x'
}, {
  name: 'x',
  frade: 'd'
}, {
  name: 'a',
  grade: 'b'
}];

function filterIt(arr, searchKey) {
  return arr.filter(function(obj) {
    return Object.keys(obj).some(function(key) {
      return obj[key].includes(searchKey);
    })
  });
}

console.log("find 'x'", filterIt(a,"x"));
console.log("find 'a'", filterIt(a,"a"));
console.log("find 'z'", filterIt(a,"z"));

或使用ES6

代码语言:javascript
复制
function filterIt(arr, searchKey) {
  return arr.filter(obj => Object.keys(obj).some(key => obj[key].includes(searchKey)));
}
票数 57
EN

Stack Overflow用户

发布于 2011-12-15 16:41:01

search函数将返回包含包含搜索查询的值的所有对象

代码语言:javascript
复制
function search(arr, s){
    var matches = [], i, key;
    
    for( i = arr.length; i--; )
        for( key in arr[i] )
            if( arr[i].hasOwnProperty(key) && arr[i][key].indexOf(s) > -1 )
                matches.push( arr[i] );  // <-- This can be changed to anything

    return matches;
};

// dummy data
var items = [
      {
        "foo" : "bar",
        "bar" : "sit"
      },
      {
        "foo" : "lorem",
        "bar" : "ipsum"
      },
      {
        "foo" : "dolor",
        "bar" : "amet"
      }
];
    
var result = search(items, 'lo'); // search "items" for a query value
console.log(result); // print the result

票数 7
EN

Stack Overflow用户

发布于 2016-11-30 22:23:12

这是一个建议,它使用键(如果给定)或对象的所有属性来搜索值。

代码语言:javascript
复制
function filter(array, value, key) {
    return array.filter(key
        ? a => a[key] === value
        : a => Object.keys(a).some(k => a[k] === value)
    );
}

var a = [{ name: 'xyz', grade: 'x' }, { name: 'yaya', grade: 'x' }, { name: 'x', frade: 'd' }, { name: 'a', grade: 'b' }];


console.log(filter(a, 'x'));
console.log(filter(a, 'x', 'name'));
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8517089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档