2010-04-01 29 views
6

Nếu tôi có hai mảng liên kết, thì cách nào hiệu quả nhất để thực hiện một khác biệt so với giá trị của chúng?Làm một "Khác biệt" trên một mảng liên kết trong javascript/jQuery?

Ví dụ, đưa ra:

array1 = { 
    foreground: 'red', 
    shape: 'circle', 
    background: 'yellow' 
    }; 

    array2 = { 
    foreground: 'red', 
    shape: 'square', 
    angle: '90', 
    background: 'yellow' 
    }; 

Làm thế nào tôi sẽ kiểm tra một chống lại khác, chẳng hạn rằng các mục thiếu thêmhay được kết quả mảng. Trong trường hợp này, nếu tôi muốn so sánh array1 trong array2, nó sẽ quay trở lại:

array3 = {shape: 'circle'} 

Trong khi nếu tôi so array2 trong array1, nó sẽ quay trở lại:

array3 = {shape: 'square', angle: '90'} 

Cảm ơn trước sự giúp đỡ của bạn!

Trả lời

7

Hãy thử điều này:

function diff(obj1, obj2) { 
    var result = {}; 
    $.each(obj1, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
      result[key] = value; 
     } 
    }); 

    return result; 
} 
3

Nếu bạn đã quen thuộc với cú pháp PHP, hãy nhìn vào http://phpjs.org/functions/index trong đó bao gồm hầu hết các chức năng mảng liên quan đến PHP chuyển đổi thành JavaScript – bao gồm array_diff

1

giải pháp RaYell là đẹp nhưng tiếc là sẽ chỉ cho bạn biết các mục trong obj2 khác hoặc không tồn tại trong obj1, nếu chúng ta cần biết cả hai mặt, hãy lấy tất cả các khóa và sau đó so sánh. Hàm sau sẽ trả về một mảng kết hợp với các giá trị khóa cho mỗi đối tượng. Oh ... để công bằng, tôi chưa thử nghiệm, nhưng điều này sẽ làm việc.

var diff = function(obj1,obj2) { 
    var newObj = $.extend({},obj1,obj2); 
    var result = {}; 
    $.each(newObj, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || !obj1.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
     result[key] = [obj1[key],obj2[key]]; 
     } 
    }); 

    return result; 
} 

Ồ, và trong khi tôi nhận ra giải pháp đầu tiên đã trả lời câu hỏi ban đầu, tôi cho rằng giải pháp trên có thể hữu ích để không yêu cầu kiểm tra hai lần.

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