【问题标题】:Get unique keys from multiple objects从多个对象中获取唯一键
【发布时间】:2016-03-08 23:30:16
【问题描述】:

如果我有一个这样的对象数组:

var mountains = [
    { name: 'Kebnekaise', elevation: 2106 },
    { name: 'Mount Ngauruhoe', elevation: 2291, comment: 'aka Mount Doom' }
];

如何获取所有唯一键,即['name', 'elevation', 'comment']

【问题讨论】:

  • 你试过什么?你确定它的性能有问题吗?您多久执行一次以使其成为性能的方式?
  • 最高性能”过于宽泛,取决于具体情况。解决您的问题。
  • 我会简单地遍历数组,然后遍历对象的键,并将它们作为键添加到结果对象。然后使用Object.keys(result) 获取唯一键列表。
  • 将问题更改为不包括性能部分。更好?
  • @Amit 我喜欢你的 ES2015 答案胜过我喜欢任何 Underscore 答案:)

标签: javascript


【解决方案1】:

在 ECMAScript 2015 中,这真的很简单:

let mountains = [
  { name: 'Kebnekaise', elevation: 2106 },
  { name: 'Mount Ngauruhoe', elevation: 2291, comment: 'aka Mount Doom' }
];

let uniqueKeys = Object.keys(Object.assign({}, ...mountains));

【讨论】:

    【解决方案2】:

    使用 ES6,可以做到

    var unique = new Set([].concat.apply([],mountains.map(Object.keys)))
    

    没有 ES6,类似

    var unique = [].concat.apply([],mountains.map(Object.keys)).filter(function(value,i,arr) {
        return arr.indexOf(value) === i;
    });
    

    【讨论】:

    • @Amit - 我猜这是因为你的更整洁,但是获取所有键的数组并从中创建一个 Set 仍然可以正常工作,它只是更长一点并且不如可读性使用传播和 Object.assign
    • 我真的希望投反对票的人有更好的理由。一个答案的好坏取决于其他答案。
    • 也想知道为什么它被否决了。很高兴看到一个最小的非 es6 解决方案。
    【解决方案3】:

    您可以遍历对象数组并使用 Object.keys(obj) 遍历每个元素的键,将它们添加到哈希中以避免重复:

    function getKeySet (data) {
      var keys = {};
    
      data.forEach(function (datum) {
        Object.keys(datum).forEach(function (key) {
          keys[key] = true;
        });
      });
    
      return Object.keys(keys);
    }
    

    或者,您可以将所有键添加到数组中并过滤掉重复项。无论哪种方式,这都是 O(nm),其中 n 是数组中的元素数,m 是键的平均数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2022-01-10
      • 2015-02-11
      • 1970-01-01
      • 2018-09-02
      相关资源
      最近更新 更多