2013-06-03 12 views
9

Cách dễ nhất để tìm các thành viên chung trong hai đối tượng Javascript là gì? Câu hỏi này không phải là về bình đẳng. Tôi không quan tâm đến giá trị của mỗi thành viên, chỉ là chúng tồn tại trong cả hai đối tượng.Tìm các thành viên chung của hai đối tượng Javascript

Dưới đây là những gì tôi đã làm cho đến nay (sử dụng underscore.js):

_.intersection(_.keys({ firstName: 'John' }), _.keys({ firstName: 'Jane', lastName: 'Doe' })) 

này mang lại cho tôi một kết quả của ['firstName'] như mong đợi, nhưng tôi muốn tìm một cách dễ dàng hơn và hiệu quả hơn, tốt nhất vanilla Javascript.

  • Có cách nào tốt hơn/dễ hơn để thực hiện việc này với dấu gạch dưới không?
  • Có cách nào tốt hơn/dễ dàng hơn để thực hiện điều này mà không có gạch dưới (được ưa thích) không?
+3

bạn có thể có nghĩa là '_.intersecton' –

+0

nhờ đã chỉ ra rằng – sellmeadog

+1

Trong JS đơn giản bạn có thể sử dụng ES5s [Object.keys] (http: //www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.14) trên mỗi đối tượng và chọn một đối tượng có ít phím nhất để kiểm tra đối tượng kia, quay trở lại vòng lặp for..in và * hasOwnProperty * kiểm tra cho các tác nhân người dùng cũ hơn. – RobG

Trả lời

10

Chắc chắn, chỉ cần lặp qua các phím của một đối tượng và xây dựng một mảng của các phím mà cổ phần đối tượng khác:

function commonKeys(obj1, obj2) { 
    var keys = []; 
    for(var i in obj1) { 
    if(i in obj2) { 
     keys.push(i); 
    } 
    } 
    return keys; 
} 
+1

+1 cho gói nó lên trong một chức năng tốt đẹp, và là 25 giây nhanh hơn :) – Phrogz

+0

Đối với Phrogz, bạn cần một thử nghiệm thuộc tính riêng 'cos * Object.keys * trả về thuộc tính của riêng. Cũng không chắc rằng OP muốn liệt kê các thuộc tính được chia sẻ bởi thừa kế. ;-) – RobG

+2

@RobG Tôi không chắc mình hiểu. Bạn có nghĩa là tôi nên sử dụng 'obj1.hasOwnProperty (i)' và 'obj2.Các thử nghiệm hasOwnProperty (i) 'thay vì' i' có thể là thành phần nguyên mẫu được người dùng định nghĩa? –

2
var common = []; 
for (var key in obj2) if (key in obj1) common.push(key); 

Chỉnh sửa cho RobG: Nếu bạn tình cờ được làm việc trong môi trường bao gồm mã không phải là mã của riêng bạn, bạn không tin tưởng (các) tác giả đã mở rộng Object.prototypecorrectly, sau đó bạn có thể wan t làm:

var common = []; 
for (var k in obj2) if (obj2.hasOwnProperty(k) && obj1.hasOwnProperty(k)) common.push(k); 

Tuy nhiên, như tôi đã nói trong các ý kiến ​​dưới đây, tôi đã viết một bài báo (với một danh hiệu viêm) về lý do tại sao tôi tin rằng đây từng là lời khuyên tốt, nhưng là lời khuyên tốt không còn:
http://phrogz.net/death-to-hasownproperty

+1

Bạn cần phải thêm một thử nghiệm thuộc tính riêng: 'if (obj2.hasOwnProprerty (key) && ...) ...'. – RobG

+0

@RobG I [mạnh mẽ không đồng ý] (http://phrogz.net/death-to-hasownproperty). :) – Phrogz

4

này sẽ làm việc cho các trình duyệt hiện đại:

function commonKeys(a, b) { 
    return Object.keys(a).filter(function (key) { 
     return b.hasOwnProperty(key); 
    }); 
}; 

// ["firstName"] 
commonKeys({ firstName: 'John' }, { firstName: 'Jane', lastName: 'Doe' }); 
+0

+1 yêu sự đơn giản của giải pháp này, tôi sẽ phải kiểm tra nó để xem nó có hoạt động trong kịch bản của tôi hay không. Tôi phải hỗ trợ lại cho IE6 . Hy vọng nó hoạt động với giải pháp tương thích được hiển thị ở đây: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys – sellmeadog

+1

Nếu bạn phải hỗ trợ quay lại IE6, bạn sẽ cũng phải định nghĩa một 'Array.prototype.filter'. Sự đơn giản có thể không đáng giá thêm mã. –

0

tôi biết câu hỏi này đã được trả lời nhưng tôi muốn đưa ra một "gạch" cách để làm việc đó. Tôi cũng hy vọng rằng mọi người sẽ thảo luận cách tốt nhất "gạch dưới" để làm điều đó ở đây.

var user1 = { firstName: 'John' }, user2 = { firstName: 'Jane', lastName: 'Doe' }; 

_.keys(_.pick(user1, _.keys(user2))) 

đó là ảnh đẹp nhất của tôi, nó không làm giảm các nguyên tắc gạch dưới từ câu hỏi gốc vì vậy có lẽ đây là cách tốt nhất bạn có thể làm.

Dưới đây là câu hỏi ban đầu trong định dạng của tôi để tham khảo

_.intersection(_.keys(user1), _.keys(user2)) 
+0

thực sự là một kết quả thú vị của điều này là cách ban đầu để làm nó hỗ trợ có null cho một trong hai giá trị user1 hoặc user2. Từ những gì tôi có thể thấy thực sự câu hỏi ban đầu là "đúng" cách để làm điều này trong gạch dưới. –