Javascript 从多个对象获取唯一关键帧

Javascript 从多个对象获取唯一关键帧,javascript,Javascript,如果我有这样一个对象数组: var mountains = [ { name: 'Kebnekaise', elevation: 2106 }, { name: 'Mount Ngauruhoe', elevation: 2291, comment: 'aka Mount Doom' } ]; 如何在ECMAScript 2015中获取所有唯一键,即['name','elevation','comment']?,非常简单: let mountains = [ { name:

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

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

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

,非常简单:

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

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

在ECMAScript 2015中,它非常简单:

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

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

您可以迭代对象数组,并使用
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是键的平均数。

您可以迭代对象数组,并使用
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是键的平均数。

使用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;
});

使用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;
});

你试过什么?你确定它的性能有问题吗?你多久做一次这样的事情,它必须是最有效的方式?“最有效”太宽泛了,取决于具体情况。解决你的问题。我只需在数组中循环,然后循环对象的键,并将它们作为键添加到结果对象中。然后使用
Object.keys(result)
获取唯一键的列表。将问题更改为不包括性能部分。更好?@Amit我更喜欢你的ES2015答案,而不是任何下划线的答案:)你尝试了什么?你确定它的性能有问题吗?你多久做一次这样的事情,它必须是最有效的方式?“最有效”太宽泛了,取决于具体情况。解决你的问题。我只需在数组中循环,然后循环对象的键,并将它们作为键添加到结果对象中。然后使用
Object.keys(result)
获取唯一键的列表。将问题更改为不包括性能部分。更好?@Amit我更喜欢你的ES2015答案,而不是任何下划线答案:)@Amit-我猜这是因为你的答案更整洁,但是获得一个所有键的数组并从中创建一组键,仍然很好,它只是稍微长一点,不像使用排列和对象那样可读。我真的希望那些投票反对的人有更好的理由。作为其他答案的函数,一个答案不是好的,也不是坏的。也不知道为什么它会被否决。很高兴看到一个最小的非es6解决方案。@Amit-我猜这是因为您的解决方案更整洁,但是获取一个所有键的数组并从中创建一个集,仍然可以很好地工作,它只是稍微长一点,不像使用排列和对象那样可读。我真的希望投票被否决的人有更好的理由。作为其他答案的函数,一个答案不是好的,也不是坏的。也不知道为什么它会被否决。很高兴看到最小的非es6解决方案。