【问题标题】:how to filter keys based on values in a array of objects如何根据对象数组中的值过滤键
【发布时间】:2020-01-12 14:25:07
【问题描述】:

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

我想要只有正确的键。

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

例如:-

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

谁能帮我提取值为真的键。

预期 o/p

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

【问题讨论】:

标签: javascript arrays string typescript object


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多