按其值过滤对象

时间:2018-06-13 08:53:35

标签: javascript

我正在尝试根据具有与字符串部分匹配的值的对象来过滤对象数组。

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

然而,这不起作用,任何想法为什么?

3 个答案:

答案 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);