2016-10-17 14 views
7

Tôi muốn lấy tất cả các khóa trong một mảng đối tượng. Ban đầu, tôi chỉ lấy đối tượng đầu tiên trong mảng và sử dụng:Cách hiệu quả để lấy tất cả các khóa trong mảng đối tượng chưa được sắp xếp

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

Nhưng khi tôi nhìn kỹ hơn, tôi nhận thấy hàng đầu tiên không chứa tất cả các phím cần thiết. Trong ví dụ sau, mục thứ ba chứa tất cả các khóa nhưng bạn có thể có một trường hợp nhận được tất cả các khóa yêu cầu kết hợp nhiều đối tượng.

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

Làm cách nào để có được tất cả các khóa duy nhất trong một loạt các đối tượng có hiệu quả ở quy mô lớn?

Trả lời

5

Bạn có thể sử dụng reduce()Set để nhận kết quả mong muốn.

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

Bạn chỉ có thể làm như sau;

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

Theo một nhận xét rất chính đáng ở đây là của tôi là giải pháp tiếp theo;

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

+0

Kết quả chỉ hiển thị các phím đối tượng cuối cùng! – Sun

+0

@Peter Leger Bạn nói đúng ... Đáng xấu hổ tôi đã làm một cái gì đó mới. – Redu

2

Bạn có thể sử dụng 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);

Tôi đã thử nghiệm các console time trong trình duyệt chrome từ đoạn mã trên với mã từ @Nenad Vracar@Redu:

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

với kết quả như sau:

kết quả đầu tiên:

  • Chức năng f1: 6375.193ms
  • Chức năng f2: 6309.516ms
  • Chức năng f3: 6756.946ms

kết quả thứ hai:

  • Chức năng f1: 6152.040ms
  • Chức năng f2: 8004.565ms
  • Chức năng f3: 6885.656ms

thứ ba kết quả:

  • Chức năng f1: 5918.497ms
  • Chức năng f2: 8136.073ms
  • Chức năng f3: 7111.273ms
Các vấn đề liên quan