我正在尝试根据具有与字符串部分匹配的值的对象来过滤对象数组。
const acceptedValues = "theme";
const myObject = {
code: "themev3",
}
var filteredObject = Object.keys(myObject).reduce(function(r, e) {
if (acceptedValues.indexOf(myObject[e].toLowerCase()) >= 0) r[e] = myObject[e]
return r;
}, {})
console.log(filteredObject);
正如您所看到的,上面的对象应该在filteredObject
数组中返回,因为code
中有theme
。
然而,这不起作用,任何想法为什么?
答案 0 :(得分:1)
您正在混合搜索到的文本并从文本中搜索。在这里,您需要检查myObject[e]
是否包含acceptedValues
const acceptedValues = "theme";
const myObject = {
code: "themev3",
}
var filteredObject = Object.keys(myObject).reduce(function(r, e) {
if (myObject[e].toLowerCase().indexOf(acceptedValues) >= 0) r[e] = myObject[e]
return r;
}, {})
console.log(filteredObject);

此外,您可以使用includes
代替indexOf
,如下所示
if(myObject[e].toLowerCase().includes(acceptedValues))
答案 1 :(得分:1)
除了切换比较之外,您还可以映射键/值对并在过滤后构建新对象。
const
value = "theme",
object = { code: "themev3" },
filtered = Object.assign(
...Object
.entries(object)
.filter(([, v]) => v.toLowerCase().includes(value))
.map(([key, value]) => ({ [key]: value }))
);
console.log(filtered);
答案 2 :(得分:0)
条件应该是相反的。您需要在对象值中找到acceptedValues
的索引:
const acceptedValues = "theme";
const myObject = {
code: "themev3",
}
var filteredObject = Object.keys(myObject).reduce(function(r, e) {
if (myObject[e].toLowerCase().indexOf(acceptedValues.toLowerCase()) > -1)
r[e] = myObject[e];
return r;
}, {})
console.log(filteredObject);