2010-04-01 15 views
6

İki ilişkisel dizim varsa, onların değerlerine karşı bir fark yapmanın en etkili yolu ne olurdu?javascript/jQuery'deki İlişkilendirilmiş Dizide "Diff" Yapmak?

Örneğin, verilen:

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

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

nasıl dizi sonuçlandığını böyle ürün veyaek eksik olduğunu, diğerine karşı bir kontrol ederim. Ben dizi2 içinde dizi1 karşılaştırmak istiyorsa bu durumda, bu dönecekti: Ben dizi1 içinde dizi2 karşılaştırıldığında eğer iken

array3 = {shape: 'circle'} 

, bu dönecekti:

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

peşin! Yeni

cevap

7

bu deneyin: PHP sözdizimi aşina iseniz

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

    return result; 
} 
1

RaYell çözümü güzel ama ne yazık ki sadece obj2'deki objelerden farklı ya da objektif olmayan obj1'i, her iki tarafı bilmemiz gerekirse, tüm anahtarları alalım ve sonra karşılaştıralım. Aşağıdaki işlev, her nesne için anahtar değerlerle ilişkilendirilebilir bir dizi döndürecektir. Ah ... adil olmak için henüz test olmadım ama işe yaramalı.

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

Oh, ve ilk çözüm, ilk sorunuza cevap olduğunu kabul yok ederken, yukarıdaki çözüm iki kez kontrol gerektirmeyen şekilde ilk kullanıcı yarayabilecek başka yaklaşım sunuyor düşünüyorum.