我有两个数组;一个带有子字符串,另一个带有对象。
我想获得一个对象数组,其中这些对象包含子字符串数组中的任何子字符串。
到目前为止,我已经尝试使用filter
和findIndex
。如果子字符串相同,则每种方法都有效。在这种情况下,甚至 indexOf
也不起作用。我不是 JavaScript 专家,所以可能我做错了什么。
脚本
var strings = ['12', 'sv', 'eli', '23', '34'];
var data = [
{
a: 349531284734,
b: "sv123eippppppeli",
c: "aaabbbccc"
},
{
a: 1111123333312,
b: "ccccccccccccs2222",
c: "aaabbbccc"
},
{
a: 2222234,
b: "elllllllla",
c: false
},
];
// attempt 1
var results = data.filter(arr =>
Object.keys(arr).some(key => {
return String(arr[key]).toLowerCase().includes(strings) // or indexOf
})
);
// attempt 2 with only one data index
var obj = Object.values(data[0]);
var results = strings.some(s => obj.includes(s)) // or indexOf or findIndex;
解释
在这个给定子串的例子中,只有 data[0]
是匹配的,因为它至少包含 strings
数组中的一个子串。
如何在不使用“for 循环”的情况下完成这项工作?
谢谢
最佳答案
一个避免需要“for-loop”语法的简单解决方案是 filter()
data
的每个对象通过一个谓词检查是否有任何值 (当前正在过滤的项目)包含 strings
数组的任何一个值。
在代码中,这可以表示为:
var strings = ['12', 'sv', 'eli', '23', '34'];
var data = [{
a: 349531284734,
b: "sv123eippppppeli",
c: "aaabbbccc"
},
{
a: 1111123333312,
b: "ccccccccccccs2222",
c: "aaabbbccc"
},
{
a: 2222234,
b: "elllllllla",
c: false
},
];
// Local helper retruns true if case-insenstive value in strings array
const stringHasValue = (value) => strings
.some(str => value.toLowerCase().includes(str.toLowerCase()))
// Filter each item in data array by existance of a value containing
// substring in strings array
var result = data.filter((item) => Object.values(item)
.filter(value => typeof value === 'string')
.some(stringHasValue, []));
console.log(result);
关于JavaScript:在数组中查找具有数组子字符串的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58227707/