JavaScript'te iki nesne dizisi arasındaki fark nasıl elde edilir


110

Bunun gibi iki sonuç kümem var:

// Result 1
[
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" },
    { value: "4", display: "Ryan" }
]

// Result 2
[
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" },
]

İhtiyacım olan nihai sonuç, bu diziler arasındaki farktır - nihai sonuç şöyle olmalıdır:

[{ value: "4", display: "Ryan" }]

JavaScript'te böyle bir şey yapmak mümkün mü?


Öyleyse, her iki dizide de bulunmayan, değere ve görüntüye göre filtrelenmiş tüm öğeleri içeren bir dizi mi istiyorsunuz ?
Cerbrus

İki dizi arasındaki farkı istiyorum. Değer, dizinin herhangi birinde mevcut olacaktır.
BKM


2
Firebug konsolunda oturum açıldığında görüntülenen dizi gibi görünüyor ...
Mike C

2
Üzgünüz, ancak json nesnesi yanlış ... değiştirmeniz gerekiyor = için:
Walter Zalazar

Yanıtlar:


145

Yalnızca yerel JS kullanarak, bunun gibi bir şey çalışacaktır:

a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}]
b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}]

function comparer(otherArray){
  return function(current){
    return otherArray.filter(function(other){
      return other.value == current.value && other.display == current.display
    }).length == 0;
  }
}

var onlyInA = a.filter(comparer(b));
var onlyInB = b.filter(comparer(a));

result = onlyInA.concat(onlyInB);

console.log(result);


1
Bu işe yarıyor ve belki de en iyi doğrudan cevap, ancak bunu bir yüklem ve iki listeyi kabul eden ve yüklemi uygun şekilde uygulayarak iki listenin simetrik farkını döndüren bir şeye dönüştürmek güzel olurdu. (Tüm m * n karşılaştırmalarını iki kez yapmaktan daha verimli olsaydı ekstra puan!)
Scott Sauyet

@ScottSauyet: "yüklem" terimine aşina değilim (Anadili İngilizce olan biri değil). Cevabındaki bu return a.value ===...mu? (Güzel çözüm, bu arada, +1) Kullanmanın yanı sıra Array.prototype.some(), bunu yapmanın daha verimli / daha kısa bir yolunu bulamıyorum.
Cerbrus

2
@Cerbrus: Evet. Bir yüklem, bir boole ( trueveya falsedeğer) döndüren bir işlevdir . Bu durumda, eşitlik için test kavramını, kullanıcının eşitlik denetimini bir işlev olarak geçmesini isteyerek kodun geri kalanından ayırırsak, yapabiliriz. basit bir genel algoritma.
Scott Sauyet

@ScottSauyet: Bu cevabı tekrar bulmam biraz zaman aldı, ama şimdi biraz daha iyi: D
Cerbrus

ES6 const Comparer = (otherArray) => (current) => otherArray.filter ((other) => other.value == current.value && other.display == current.display) .length == 0;
Shnigi

72

İle Array.prototype.filter()kombinasyon halinde kullanabilirsiniz Array.prototype.some().

İşte bir örnek (dizilerinizin değişkenlerde depolandığını varsayarsak result1ve result2):

//Find values that are in result1 but not in result2
var uniqueResultOne = result1.filter(function(obj) {
    return !result2.some(function(obj2) {
        return obj.value == obj2.value;
    });
});

//Find values that are in result2 but not in result1
var uniqueResultTwo = result2.filter(function(obj) {
    return !result1.some(function(obj2) {
        return obj.value == obj2.value;
    });
});

//Combine the two arrays of unique entries
var result = uniqueResultOne.concat(uniqueResultTwo);

52

ES6'daki tek astarlı çözümleri sevenler için şunun gibi bir şey:

const arrayOne = [ 
  { value: "4a55eff3-1e0d-4a81-9105-3ddd7521d642", display: "Jamsheer" },
  { value: "644838b3-604d-4899-8b78-09e4799f586f", display: "Muhammed" },
  { value: "b6ee537a-375c-45bd-b9d4-4dd84a75041d", display: "Ravi" },
  { value: "e97339e1-939d-47ab-974c-1b68c9cfb536", display: "Ajmal" },
  { value: "a63a6f77-c637-454e-abf2-dfb9b543af6c", display: "Ryan" },
];
          
const arrayTwo = [
  { value: "4a55eff3-1e0d-4a81-9105-3ddd7521d642", display: "Jamsheer"},
  { value: "644838b3-604d-4899-8b78-09e4799f586f", display: "Muhammed"},
  { value: "b6ee537a-375c-45bd-b9d4-4dd84a75041d", display: "Ravi"},
  { value: "e97339e1-939d-47ab-974c-1b68c9cfb536", display: "Ajmal"},
];

const results = arrayOne.filter(({ value: id1 }) => !arrayTwo.some(({ value: id2 }) => id2 === id1));

console.log(results);


4
Lütfen açıklayın!
Bruno Brito

Bu çözümü beğendim. Yalnızca bir değer özelliğine sahip geçici bir nesne oluşturur, bu nedenle onu küçük tutun
deanwilliammills

16

Hem yaklaşımları için ben fikirlerin benzer olsa da, biraz daha genel amaçlı bir yaklaşım @Cerbrus ve @Kasper MOERCH . İki nesnenin eşit olup olmadığını belirlemek için bir yüklemi kabul eden bir işlev oluşturuyorum (burada $$hashKeyözelliği göz ardı ediyoruz , ancak herhangi bir şey olabilir) ve bu koşula göre iki listenin simetrik farkını hesaplayan bir işlev döndürüyorum:

a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}]
b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}]

var makeSymmDiffFunc = (function() {
    var contains = function(pred, a, list) {
        var idx = -1, len = list.length;
        while (++idx < len) {if (pred(a, list[idx])) {return true;}}
        return false;
    };
    var complement = function(pred, a, b) {
        return a.filter(function(elem) {return !contains(pred, elem, b);});
    };
    return function(pred) {
        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };
    };
}());

var myDiff = makeSymmDiffFunc(function(x, y) {
    return x.value === y.value && x.display === y.display;
});

var result = myDiff(a, b); //=>  {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"}

Erken kaçması bakımından Cerebrus'un yaklaşımına göre (Kasper Moerch'in yaklaşımı gibi) küçük bir avantajı vardır; bir eşleşme bulursa, listenin geri kalanını kontrol etmeye zahmet etmez. curryKullanışlı bir işlevim olsaydı, bunu biraz farklı yapardım, ancak bu iyi çalışıyor.

Açıklama

Bir yorum, yeni başlayanlar için daha ayrıntılı bir açıklama istedi. İşte bir deneme.

Aşağıdaki işlevi şunlara aktarıyoruz makeSymmDiffFunc:

function(x, y) {
    return x.value === y.value && x.display === y.display;
}

Bu fonksiyon, iki nesnenin eşit olduğuna nasıl karar verdiğimizdir. Dönen tüm işlevler gibi trueveya false"yüklem işlevi" olarak adlandırılabilir, ancak bu yalnızca terminolojidir. Ana nokta, makeSymmDiffFunciki nesneyi kabul eden ve trueeşit falseolduğunu düşünürsek , yoksa geri dönen bir işlevle yapılandırılmış olmasıdır .

Bunu kullanarak makeSymmDiffFunc("simetrik fark yaratma işlevi" okuyun) bize yeni bir işlev döndürür:

        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };

Aslında kullanacağımız işlev budur. Biz ona iki liste geçiriyoruz ve o birinci değil ikincideki öğeleri buluyor, sonra ikinci listedeki öğeleri bulamıyor ve bu iki listeyi birleştiriyor.

Yine de tekrar baktığımda, kodunuzdan kesinlikle bir ipucu alabilir ve ana işlevi aşağıdakileri kullanarak biraz basitleştirebilirdim some:

var makeSymmDiffFunc = (function() {
    var complement = function(pred, a, b) {
        return a.filter(function(x) {
            return !b.some(function(y) {return pred(x, y);});
        });
    };
    return function(pred) {
        return function(a, b) {
            return complement(pred, a, b).concat(complement(pred, b, a));
        };
    };
}());

complementyüklemi kullanır ve ilk listesinin öğelerini ikinci değil döndürür. Bu, ayrı bir containsişleve sahip ilk geçişimden daha basit .

Son olarak, ana işlev, dahili işlevi genel kapsamın dışında tutmak için hemen çağrılan bir işlev ifadesine ( IIFE ) sarılır complement.


Birkaç yıl sonra güncelleme

ES2015 artık her yerde oldukça yaygın hale geldiğine göre, aynı tekniği çok daha az standart şablonla önereceğim:

const diffBy = (pred) => (a, b) => a.filter(x => !b.some(y => pred(x, y)))
const makeSymmDiffFunc = (pred) => (a, b) => diffBy(pred)(a, b).concat(diffBy(pred)(b, a))

const myDiff = makeSymmDiffFunc((x, y) => x.value === y.value && x.display === y.display)

const result = myDiff(a, b)
//=>  {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"}

1
Kodunuza biraz daha açıklama ekleyebilir misiniz? JavaScript'e yeni başlayan birinin yüklem yaklaşımının nasıl çalıştığını anlayacağından emin değilim.
kaspermoerch

1
@KasperMoerch: Uzun bir açıklama eklendi. Umarım bu yardımcı olur. (Ayrıca bu kodun sahip olması gereken ciddi bir temizlik olduğunu fark etmemi sağladı.)
Scott Sauyet

10
import differenceBy from 'lodash/differenceBy'

const myDifferences = differenceBy(Result1, Result2, 'value')

Bu, valueonları karşılaştırmak için anahtarı kullanarak iki nesne dizisi arasındaki farkı döndürür . Diğer anahtarlar göz ardı edildiğinden, aynı değere sahip iki şeyin döndürülmeyeceğini unutmayın.

Bu, Lodash'ın bir parçası .


Yukarıdaki json nesnesi yanlış. Bu yolu denediğinizde değiştirin = için:
Walter Zalazar

7

Dizideki her nesneye karşılık gelen benzersiz değer olarak anahtarlara sahip bir nesne oluşturabilir ve ardından her diziyi, diğerinin nesnesindeki anahtarın varlığına göre filtreleyebilirsiniz. Operasyonun karmaşıklığını azaltır.

ES6

let a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}];
let b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}];

let valuesA = a.reduce((a,{value}) => Object.assign(a, {[value]:value}), {});
let valuesB = b.reduce((a,{value}) => Object.assign(a, {[value]:value}), {});
let result = [...a.filter(({value}) => !valuesB[value]), ...b.filter(({value}) => !valuesA[value])];
console.log(result);

ES5

var a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"},  { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}];
var b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}];

var valuesA = a.reduce(function(a,c){a[c.value] = c.value; return a; }, {});
var valuesB = b.reduce(function(a,c){a[c.value] = c.value; return a; }, {});
var result = a.filter(function(c){ return !valuesB[c.value]}).concat(b.filter(function(c){ return !valuesA[c.value]}));
console.log(result);


5

@Cerbrus çözümünün yerinde olduğunu düşünüyorum. Aynı çözümü uyguladım ancak tekrarlanan kodu kendi işlevine (DRY) çıkardım.

 function filterByDifference(array1, array2, compareField) {
  var onlyInA = differenceInFirstArray(array1, array2, compareField);
  var onlyInb = differenceInFirstArray(array2, array1, compareField);
  return onlyInA.concat(onlyInb);
}

function differenceInFirstArray(array1, array2, compareField) {
  return array1.filter(function (current) {
    return array2.filter(function (current_b) {
        return current_b[compareField] === current[compareField];
      }).length == 0;
  });
}

4

Bu çözümü filtre ve bazılarını kullanarak buldum.

resultFilter = (firstArray, secondArray) => {
  return firstArray.filter(firstArrayItem =>
    !secondArray.some(
      secondArrayItem => firstArrayItem._user === secondArrayItem._user
    )
  );
};


2

fark a on b ve fark b on a yapabilir, sonra her iki sonucu da birleştirebilirsiniz

let a = [
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" },
    { value: "4", display: "Ryan" }
]

let b = [
    { value: "0", display: "Jamsheer" },
    { value: "1", display: "Muhammed" },
    { value: "2", display: "Ravi" },
    { value: "3", display: "Ajmal" }
]

// b diff a
let resultA = b.filter(elm => !a.map(elm => JSON.stringify(elm)).includes(JSON.stringify(elm)));

// a diff b
let resultB = a.filter(elm => !b.map(elm => JSON.stringify(elm)).includes(JSON.stringify(elm)));  

// show merge 
console.log([...resultA, ...resultB]);


1

Buradaki cevapların çoğu oldukça karmaşık, ancak bunun arkasındaki mantık oldukça basit değil mi?

  1. hangi dizinin daha uzun olduğunu kontrol edin ve onu ilk parametre olarak sağlayın (uzunluk eşitse, parametrelerin sıralaması önemli değildir)
  2. Dizi1 üzerinde yineleyin.
  3. Dizi1'in geçerli yineleme öğesi için dizi2'de mevcut olup olmadığını kontrol edin
  4. Mevcut DEĞİLSE,
  5. 'Fark' dizisine itin
const getArraysDifference = (longerArray, array2) => {
  const difference = [];

  longerArray.forEach(el1 => {      /*1*/
    el1IsPresentInArr2 = array2.some(el2 => el2.value === el1.value); /*2*/

    if (!el1IsPresentInArr2) { /*3*/
      difference.push(el1);    /*4*/
    }
  });

  return difference;
}

O (n ^ 2) karmaşıklığı.


1
artı 1 karmaşıklık dahil
delavago1999

0

Her türden 2 nesneyi karşılaştıran ve gist.github.com/bortunac "diff.js" gibi bir değişiklik işleyicisini çalıştırabilen genelleştirilmiş bir fark oluşturdum.

old_obj={a:1,b:2,c:[1,2]}
now_obj={a:2 , c:[1,3,5],d:55}

böylece a özelliği değiştirilir, b silinir, c değiştirilir, d eklenir

var handler=function(type,pointer){
console.log(type,pointer,this.old.point(pointer)," | ",this.now.point(pointer)); 

}

şimdi beğen

df=new diff();
df.analize(now_obj,old_obj);
df.react(handler);

konsol gösterecek

mdf ["a"]  1 | 2 
mdf ["c", "1"]  2 | 3 
add ["c", "2"]  undefined | 5 
add ["d"]  undefined | 55 
del ["b"]  2 | undefined 

0

En genel ve basit yol:

findObject(listOfObjects, objectToSearch) {
    let found = false, matchingKeys = 0;
    for(let object of listOfObjects) {
        found = false;
        matchingKeys = 0;
        for(let key of Object.keys(object)) {
            if(object[key]==objectToSearch[key]) matchingKeys++;
        }
        if(matchingKeys==Object.keys(object).length) {
            found = true;
            break;
        }
    }
    return found;
}

get_removed_list_of_objects(old_array, new_array) {
    // console.log('old:',old_array);
    // console.log('new:',new_array);
    let foundList = [];
    for(let object of old_array) {
        if(!this.findObject(new_array, object)) foundList.push(object);
    }
    return foundList;
}

get_added_list_of_objects(old_array, new_array) {
    let foundList = [];
    for(let object of new_array) {
        if(!this.findObject(old_array, object)) foundList.push(object);
    }
    return foundList;
}

0

Büyük diziler söz konusu olduğunda harita nesnesini tercih ederim.

// create tow arrays
array1 = Array.from({length: 400},() => ({value:Math.floor(Math.random() * 4000)}))
array2 = Array.from({length: 400},() => ({value:Math.floor(Math.random() * 4000)}))

// calc diff with some function
console.time('diff with some');
results = array2.filter(({ value: id1 }) => array1.some(({ value: id2 }) => id2 === id1));
console.log('diff results ',results.length)
console.timeEnd('diff with some');

// calc diff with map object
console.time('diff with map');
array1Map = {};
for(const item1 of array1){
    array1Map[item1.value] = true;
}
results = array2.filter(({ value: id2 }) => array1Map[id2]);
console.log('map results ',results.length)
console.timeEnd('diff with map');


0

JavaScript, O (1) ekleme ve arama süresi sağlayan Haritalar'a sahiptir. Bu nedenle, bu O (n) ile çözülebilir (diğer tüm cevapların yaptığı gibi O (n²) değil). Bunun için, her nesne için benzersiz bir ilkel (dizi / sayı) anahtar oluşturmak gerekir. Biri olabilir JSON.stringify, ancak bu oldukça hataya açıktır, çünkü öğelerin sırası eşitliği etkileyebilir:

 JSON.stringify({ a: 1, b: 2 }) !== JSON.stringify({ b: 2, a: 1 })

Bu nedenle, değerlerin hiçbirinde görünmeyen bir sınırlayıcı alır ve manuel olarak bir dize oluştururum:

const toHash = value => value.value + "@" + value.display;

Ardından bir Harita oluşturulur. Haritada zaten bir öğe varsa, kaldırılır, aksi takdirde eklenir. Bu nedenle, yalnızca tuhaf zamanlar (yalnızca bir kez) dahil edilen öğeler kalır. Bu, yalnızca her dizideki öğeler benzersizse çalışır:

const entries = new Map();

for(const el of [...firstArray, ...secondArray]) {
  const key = toHash(el);
  if(entries.has(key)) {
    entries.delete(key);
  } else {
    entries.set(key, el);
  }
}

const result = [...entries.values()];


0

Bir dizideki ilk öğeyi başka bir dizideki değerlerden hiçbiriyle eşleşmeyen seçmenin bir yolunu ararken bu soruyla karşılaştım ve sonunda array.find () ve array.filter () ile sıralamayı başardım. bu

var carList= ['mercedes', 'lamborghini', 'bmw', 'honda', 'chrysler'];
var declinedOptions = ['mercedes', 'lamborghini'];

const nextOption = carList.find(car=>{
    const duplicate = declinedOptions.filter(declined=> {
      return declined === car
    })
    console.log('duplicate:',duplicate) //should list out each declined option
    if(duplicate.length === 0){//if theres no duplicate, thats the nextOption
      return car
    }
})

console.log('nextOption:', nextOption);
//expected outputs
//duplicate: mercedes
//duplicate: lamborghini
//duplicate: []
//nextOption: bmw

Bir sonraki en iyi seçeneği çapraz kontrol etmeden önce güncellenmiş bir listeyi getirmeye devam etmeniz gerekiyorsa, bu yeterince iyi çalışmalıdır :)


0

Ek olarak, farklı olan iki nesne dizisi diyelim. key value

// Array Object 1
const arrayObjOne = [
    { userId: "1", display: "Jamsheer" },
    { userId: "2", display: "Muhammed" },
    { userId: "3", display: "Ravi" },
    { userId: "4", display: "Ajmal" },
    { userId: "5", display: "Ryan" }
]

// Array Object 2
const arrayObjTwo =[
    { empId: "1", display: "Jamsheer", designation:"Jr. Officer" },
    { empId: "2", display: "Muhammed", designation:"Jr. Officer" },
    { empId: "3", display: "Ravi", designation:"Sr. Officer" },
    { empId: "4", display: "Ajmal", designation:"Ast. Manager" },
]

İki dizi nesnesinin filteriçinde es5veya native jsçıkarmak için kullanabilirsiniz .

//Find data that are in arrayObjOne but not in arrayObjTwo
var uniqueResultArrayObjOne = arrayObjOne.filter(function(objOne) {
    return !arrayObjTwo.some(function(objTwo) {
        return objOne.userId == objTwo.empId;
    });
});

Gelen ES6sizinle Ok fonksiyonunu kullanabilirsiniz Nesne Strüktür kırıcı ait ES6.

const ResultArrayObjOne = arrayObjOne.filter(({ userId: userId }) => !arrayObjTwo.some(({ empId: empId }) => empId === userId));

console.log(ResultArrayObjOne);

0

let obj1 =[
                 { id: 1, submenu_name: 'login' },
                 { id: 2, submenu_name: 'Profile',}, 
                 { id: 3, submenu_name: 'password',  },  
                 { id: 4, submenu_name: 'reset',}
               ] ;
 let obj2 =[
                 { id: 2}, 
                 { id: 3 },
               ] ;
               
// Need Similar obj 
const result1 = obj1.filter(function(o1){
 return obj2.some(function(o2){
    return o1.id == o2.id;          // id is unnique both array object
  });
});
 console.log(result1);



// Need differnt obj 
 const result2 = obj1.filter(function(o1){
 return !obj2.some(function(o2){    //  for diffrent we use NOT (!) befor obj2 here
    return o1.id == o2.id;          // id is unnique both array object
  });
});
 console.log(result2);


-3

Harici kitaplıkları kullanmak istiyorsanız, bunu başarmak için undercore.js'de _.difference kullanabilirsiniz. _.difference, diziden diğer dizilerde bulunmayan değerleri döndürür.

_.difference([1,2,3,4,5][1,4,10])

==>[2,3,5]

12
Bu yalnızca ilkel değerlere sahip dizilerde çalışır. Dizi, bu sorunun sorduğu gibi bir nesne listesi içeriyorsa, nesnelerin kendileri yerine referansları karşılaştırmaya çalıştığı için çalışmayacaktır, bu neredeyse her zaman her şeyin farklı olduğu anlamına gelecektir.
Ross Peoples

1
teşekkürler Ross, beni bir baş ağrısından kurtardın. Altını çizmek için bir hata bildirmek üzereydim.
Etienne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.