如何根据对象数组中的值过滤键

时间:2019-09-10 19:53:02

标签: javascript arrays string typescript object

我想根据键值对中的值过滤对象。

我只想要真实的钥匙。

尝试使用array.filter,但找不到解决方法。

例如:-

const arry = [{'fname': true}, {'lname': true}, {'country': false}];

有人可以帮助我如何提取具有真实值的键。

预期o / p

  

['fname','lname'],因为它们是唯一正确的值。

2 个答案:

答案 0 :(得分:1)

您可以缩小数组,获取第一个条目的条目并检查值。如果值是真,请按键。

var array = [{ fname: true }, { lname: true }, { country: false }],
    keys = array.reduce((r, o) => {
        var [key, value] = Object.entries(o)[0];
        if (value) r.push(key);
        return r;
    }, []);

console.log(keys);

答案 1 :(得分:1)

Array.filter采用的函数应返回true或false,该函数指示是否应保留数组中的特定元素。

您有一个数组对象,并且对象本身可以具有多个键和值。您需要在这里进行多步操作:

  1. 将数组对象简化为单个对象(如果多个对象包含相同的键,则可能会出现问题!)
  2. 从组合对象中选择值为true的键。

您可以使用Object.assign合并对象。我们将使用Array.reduce将对象数组简化为单个对象:

const combined = arry.reduce((acc, val) => Object.assign({}, acc, val))

这将导致包含所有键值对的单个对象:

// { country: false, fname: true, lname: true}

现在,我们只需要选择具有真实值的条目即可生成数组数组:

const entries = Object.entries(combined).filter(([k, v]) => v)
// [["lname", true], ["fname", true]]

然后,我们可以映射出该数组中的键,如下所示:

entries.map(([k, v]) => k)
// ["lname", "fname"]

为简洁起见,这些步骤可以全部链接在一起。

const arry = [{'fname': true}, {'lname': true}, {'country': false}];

 Object.entries(arry.reduce((acc, val) => Object.assign({}, acc, val)))
   .filter(([k, v]) => v)
   .map(([k, v]) => k)

相关问题