我有一个JSON对象的数组。给定一个搜索字符串,我想只过滤那些将该字符串作为其属性之一的子字符串的对象。我如何有效地做到这一点?
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的一个特性。
Object.keys
Object.values
mpbci0fu2#
工作起来很有魅力:
data.filter((obj) => JSON.stringify(obj).toLowerCase().includes(query.toLowerCase()) )
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);
myss37ts4#
你可以使用filter方法来过滤数组,然后使用Object.keys函数来获取当前对象的键数组。然后你可以循环每个键并检查它是否有子字符串(我添加了一些保护措施来防止在没有该方法的情况下对标识符调用.indexOf)。
filter
.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; });
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 ) )
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);
rjjhvcjd7#
感谢@str的贡献。我只是更新了一点,因为它不工作,新版本的js处于严格模式。在检查includes方法之前,我们需要将最终的val转换为字符串。
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)));
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);
8条答案
按热度按时间cwdobuhd1#
假设你想在属性 value 中找到子字符串,你可以使用以下代码:
如果要搜索属性 name,请使用
Object.keys
而不是Object.values
。请注意,
Object.values
是ES2017的一个特性。mpbci0fu2#
工作起来很有魅力:
nc1teljy3#
也许你想做这样的事情:
myss37ts4#
你可以使用
filter
方法来过滤数组,然后使用Object.keys
函数来获取当前对象的键数组。然后你可以循环每个键并检查它是否有子字符串(我添加了一些保护措施来防止在没有该方法的情况下对标识符调用.indexOf
)。yhuiod9q5#
ryhaxcpt6#
对str的答案稍作改进,以获得更好的性能;
rjjhvcjd7#
感谢@str的贡献。我只是更新了一点,因为它不工作,新版本的js处于严格模式。在检查
includes
方法之前,我们需要将最终的val
转换为字符串。o4hqfura8#
我发现了一个适合我的方法,我进一步将查询字符串转换为小写: