2015-02-20 13 views
12

Tôi đang cố gắng so sánh hai đối tượng với dấu gạch dưới.Sử dụng underscore.js để so sánh hai đối tượng

Object 1 (Filter)

{ 
    "tuxedoorsuit":"tuxedoorsuit-tuxedo", 
    "occasions":"occasions-wedding" 
} 

Object 2 (Thuộc tính)

{ 
    "tuxedoorsuit":"tuxedoorsuit-tuxedo", 
    "occasions":"occasions-wedding", 
    "occasions":"occasions-prom", 
    "product_fit":"product_fit-slim", 
    "colorfamily":"colorfamily-black" 
} 

Tôi muốn trở thành sự thật khi tất cả các mục của đối tượng 1 được tìm thấy trong Object 2. gì sẽ là phương pháp gạch dưới tốt nhất để sử dụng cho điều này?

+4

gì về http: // underscorejs .org/# isEqual và http://underscorejs.org/#isMatch? –

+1

@ ArnaldoIgnacioGasparVéjar: Bạn nên làm cho câu trả lời đó. Nó tốt hơn nhiều so với hiện đang được chấp nhận. – Bergi

+0

@Bergi: Tôi đồng ý 'isMatch' sẽ tốt hơn nhiều. Nhưng thực sự thú vị khi lưu ý rằng nó sẽ không hoạt động trong trường hợp này, bởi vì "Object 2" không đúng định dạng. Nó có hai lần cùng một thuộc tính 'dịp'.[isMatch] (http://underscorejs.org/docs/underscore.html#section-106) đưa "Object 2" vào một Object chuẩn và nó sẽ chỉ giữ giá trị cuối cùng của thuộc tính này: 'occasion-prom'. Sau đó nó sẽ trả về 'false'. – slaur4

Trả lời

20

Edit: Theo Arnaldo's comment, bạn có thể sử dụng isMatch chức năng, như thế này

console.log(_.isMatch(object2, object1)); 

Mô tả nói,

_.isMatch(object, properties)

Cho bạn biết nếu các phím và các giá trị trong thuộc tính được chứa trong đối tượng.

Nếu bạn muốn lặp chính mình, chỉ cần sử dụng _.keys_.every, như thế này

_.every(_.keys(object1), function(currentKey) { 
    return _.has(object2, currentKey) && 
        _.isEqual(object1[currentKey], object2[currentKey]); 
}); 

Hoặc phiên bản xích,

var result = _.chain(object1) 
    .keys() 
    .every(function(currentKey) { 
     return _.has(object2, currentKey) && 
      _.isEqual(object1[currentKey], object2[currentKey]); 
    }) 
    .value(); 

Nếu kết quả là true, nó có nghĩa là tất cả các phím trong object1 đều ở trong object2 và các giá trị của chúng cũng bằng nhau.

Điều này về cơ bản lặp qua tất cả các phím của object1 và kiểm tra xem giá trị tương ứng với khóa trong object1 có bằng với giá trị trong object2 hay không.

+0

Làm cách nào để sử dụng bên trong _.filter? – Casey

+0

@Casey Vui lòng chỉnh sửa câu hỏi và bao gồm tất cả thông tin – thefourtheye

+0

Điều này hiệu quả! Tôi đã có thể sửa đổi nó một chút để làm việc bên trong _.filter(). Cảm ơn! – Casey

6

Để so sánh hai đối tượng sử dụng underscore.js

**isEqual :** _.isEqual(object, other) 

Thực hiện một sự so sánh sâu tối ưu giữa hai đối tượng, để xác định xem họ cần được xem xét bình đẳng.

Ex:

var stooge = {name: 'moe', luckyNumbers: [13, 27, 34]}; 
    var clone = {name: 'moe', luckyNumbers: [13, 27, 34]}; 
    _.isEqual(stooge, clone) 
     Returns True 
+1

Trong khi 'isEqual' khá hữu ích, nó sẽ không hoạt động nếu đối tượng kia có thuộc tính bổ sung, như trong trường hợp của OP. –

+0

Nó cũng sẽ không hoạt động nếu thứ tự các khóa không giống nhau: / –

0

Dựa trên chức năng trước đó tạo ra đơn giản an ủi ra chức năng:

var compareMe = function (obj1, obj2, parentKey) { 
    parentKey = parentKey || ''; 
    _.each(_.keys(obj1), function (key) { 
    if(_.isObject(obj1[key])) { 
     compareMe(obj1[key], obj2[key], parentKey + key + '.') 
    } else { 
     if (!_.has(obj2, key) || !_.isEqual(obj1[key], obj2[key])) { 
      console.log(parentKey + key, obj1[key], obj2[key]); 
     } 
    } 
    }) 
}; 

Và gọi như: compareMe (obj1, obj1)

Các vấn đề liên quan