高效获取无序对象数组中所有键的方法

7

我希望获取一个对象数组中的所有键。最初,我只是获取了数组中的第一个对象,并使用了以下代码:

var keys = Object.keys(tableData[0]);

但是当我仔细查看数据时,发现第一行并没有包含所有所需的键。在下面的示例中,第三个项目包含所有的键,但是有可能需要组合多个对象才能获取所有的键。

var tableData = [
  { first:"jeff", last:"doe", phone: "2891" },
  { first:"sarah", phone:"this", county: "usa" }
  { first:"bob", last:"brown", county: "usa", phone: "23211" }
];

如何在大规模情况下高效获取对象数组中的所有唯一键?

3个回答

5
你可以使用 reduce()Set 来获得所需的结果。

var array = [
  { first:"jeff", last:"doe", phone: "2891" },
  { first:"sarah", phone:"this", county: "usa" },
  { first:"bob", last:"brown", county: "usa", phone: "23211" }
];

var keys = [...new Set(array.reduce(function(r, e) {
  r = r.concat(Object.keys(e));
  return r;
}, []))];

console.log(keys)


3
你可以按照以下步骤操作:

var array = [
  { first:"jeff", last:"doe", phone: "2891" },
  { first:"sarah", phone:"this", county: "usa" },
  { first:"bob", last:"brown", county: "usa", phone: "23211" }
];

var result = array.reduce((p,o) => Object.assign(p,Object.keys(o)),[]);
console.log(result);

根据一个非常正确的评论,这是我的下一个解决方案;

var array = [
  { first:"jeff", last:"doe", phone: "2891", moron: "me"},
  { first:"sarah", phone:"this", county: "usa" },
  { first:"bob", last:"brown", county: "usa", phone: "23211" }
];

var result = array.reduce((p,o) => p.concat(Object.keys(o).filter(k => !p.includes(k))),[]);
console.log(result);


结果只显示最后一个对象的键! - user3589620
@Peter Leger 你是对的... 可耻的是,我做了一些新的事情。 - Redu

2
你可以使用 map()Set

var arr = [
  { first:"jeff", last:"doe", phone: "2891", something: "4" },
  { first:"sarah", phone:"this", county: "usa" },
  { first:"bob", last:"brown", county: "usa", phone: "23211", lastrow: "lr" }
];

var set = new Set();
arr.map(obj => {
  Object.keys(obj).forEach(el => {
    set.add(el);
  });
});
var res = [...set];
console.log(res);

我已经使用上面的代码与@Nenad Vracar@Redu的代码一起在Chrome浏览器中测试了console time
var array = [
    { first:"jeff", last:"doe", phone: "2891", something: "4" },
    { first:"sarah", phone:"this", county: "usa" },
    { first:"bob", last:"brown", county: "usa", phone: "23211", lastrow: "lr" }
];

function f1(arr) { // Peter Leger
    var set = new Set();
    arr.map(obj => {
        Object.keys(obj).forEach(el => {
            set.add(el);
        });
    });
    var res = [...set];
    return res; 
} 

function f2(arr) { // Nenad Vracar
    var keys = [...new Set(arr.reduce(function(r, e) {
        r = r.concat(Object.keys(e));
        return r;
    }, []))];
    return keys;
}

function f3(arr) { // Redu
    var result = arr.reduce((p,o) => p.concat(Object.keys(o).filter(k => !p.includes(k))),[]);
    return result;
}

var iterations = 1000000;
console.time('Function f1');
for(var i = 0; i < iterations; i++ ){
    f1(array);
};
console.timeEnd('Function f1')

console.time('Function f2');
for(var i = 0; i < iterations; i++ ){
    f2(array);
};
console.timeEnd('Function f2')

console.time('Function f3');
for(var i = 0; i < iterations; i++ ){
    f3(array);
};
console.timeEnd('Function f3')

以下是结果:
第一个结果:
- 函数 f1:6375.193毫秒 - 函数 f2:6309.516毫秒 - 函数 f3:6756.946毫秒
第二个结果:
- 函数 f1:6152.040毫秒 - 函数 f2:8004.565毫秒 - 函数 f3:6885.656毫秒
第三个结果:
- 函数 f1:5918.497毫秒 - 函数 f2:8136.073毫秒 - 函数 f3:7111.273毫秒

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接