json JavaScript-在对象数组的属性中搜索字符串

oewdyzsn  于 2023-04-13  发布在  Java
关注(0)|答案(8)|浏览(123)

我有一个JSON对象的数组。给定一个搜索字符串,我想只过滤那些将该字符串作为其属性之一的子字符串的对象。我如何有效地做到这一点?

cwdobuhd

cwdobuhd1#

假设你想在属性 value 中找到子字符串,你可以使用以下代码:

const arr = [
  {a:'abc', b:'efg', c:'hij'},
  {a:'abc', b:'efg', c:'hij'},
  {a:'123', b:'456', c:'789'},
];

const search = 'a';

const res = arr.filter(obj => Object.values(obj).some(val => val.includes(search)));

console.log(res);

如果要搜索属性 name,请使用Object.keys而不是Object.values
请注意,Object.values是ES2017的一个特性。

mpbci0fu

mpbci0fu2#

工作起来很有魅力:

data.filter((obj) =>
  JSON.stringify(obj).toLowerCase().includes(query.toLowerCase())
)
nc1teljy

nc1teljy3#

也许你想做这样的事情:

var list = [
    {var1: "value1", var2: "value2", var3: "value3"},
    {var1: "value4", var2: "value5", var3: "value6"},
    {var1: "value4", var2: "value3", var3: "value2"},
    {var1: "value2", var2: "value8", var3: "value6"},
    {var1: "value1", var2: "value7", var3: "value7"},
    {var1: "value1", var2: "value6", var3: "value2"},
];

var searchString = "value2";

var newList = list.filter(element => {
    for (var property in element) {
        if (element.hasOwnProperty(property)) {
            if(element[property] == searchString) {
                return true;
            }
        }
    }
});

console.log(newList);
myss37ts

myss37ts4#

你可以使用filter方法来过滤数组,然后使用Object.keys函数来获取当前对象的键数组。然后你可以循环每个键并检查它是否有子字符串(我添加了一些保护措施来防止在没有该方法的情况下对标识符调用.indexOf)。

const search = 'xyz';
const data = yourDataFunction();
const filteredData = data.filter(item => {
  let found = false;
  Object.keys(item).forEach(key => {
    if (item[key] && item[key].indexOf && item[key].indexOf(search) > -1) {
      found = true;
    }
  });
  return found;
});
yhuiod9q

yhuiod9q5#

var myStr = 'abc';
var myArr = [{abc:1,def:2}, {ghi:1,jkl:2}];
myArr.filter( obj => Object.keys(obj).some( key => key.indexOf(myStr) > -1 ) )
ryhaxcpt

ryhaxcpt6#

对str的答案稍作改进,以获得更好的性能;

const arr = [
  {a:'abc', b:'efg', c:'hij'},
  {a:'abc', b:'efg', c:'hij'},
  {a:'123', b:'456', c:'789'},
];

const search = 'a';

const res = arr.filter(obj => Object.values(obj).some(val => val.indexOf(search) >= 0));

console.log(res);
rjjhvcjd

rjjhvcjd7#

感谢@str的贡献。我只是更新了一点,因为它不工作,新版本的js处于严格模式。在检查includes方法之前,我们需要将最终的val转换为字符串。

const arr = [
   {a: 'abcd', b: 'cdaf'},
   {a: 'xyz', b: 'axcfd'}
];

const searchValue = 'a';

const newArr = arr.filter(obj => Object.values(obj).some(val => val.toString().includes(searchValue)));
o4hqfura

o4hqfura8#

我发现了一个适合我的方法,我进一步将查询字符串转换为小写:

const data = [
   {a: 'ekom', b: 'obong'},
   {a: 'fin', b: 'barr'}
];

const queryString = 'fi';

const result = data.filter((obj) => JSON.stringify(obj).toLowerCase().includes(queryString.toString().toLowerCase()));

console.log('Result: ', result);

相关问题