2017-04-04 9 views
-1

私はarr1やarr2などのオブジェクトを持つ2つの配列を持っています。重複する項目と元の項目を分けたいと思います。つまり、arr1から、arr2と一致する項目があれば、それらの項目[arr1から]は重複と見なされます。それが一致しない場合、それは元のアイテムです。2つのオブジェクトの配列を比較する方法javascript

が、私は以下のプログラムをした、しかし、予想通り、それはかなりここ

arr1 = [{name: "sunrise.jpg"},{name: "nature.jpg"},{name:"sunflower.jpg"}, {name: "sunset.jpg"}]; 

arr2 = [{ 
      "@type" : "Image", 
      "objectTypeId" : "Image", 
      "baseTypeId" : "document", 
      "name" : "sunrise.jpg", 
      "width" : "284", 
      "height" : "177" 
     }, { 
      "@type" : "Image", 
      "objectTypeId" : "Image", 
      "baseTypeId" : "document", 
      "name" : "Lao Tzu", 
      "width" : "638", 
      "height" : "960" 
     }, { 
      "@type" : "Image", 
      "objectTypeId" : "Image", 
      "baseTypeId" : "document", 
      "name" : "nature.jpg", 
      "width" : "300", 
      "height" : "168" 
     }, { 
      "@type" : "Image", 
      "objectTypeId" : "Image", 
      "baseTypeId" : "document", 
      "name" : "replay_12", 
      "width" : "500", 
      "height" : "717" 
     }, { 
      "@type" : "Image", 
      "objectTypeId" : "Image", 
      "baseTypeId" : "document", 
      "name" : "sunflower.jpg", 
      "width" : "300", 
      "height" : "168" 
     } 
    ]; 

var originalItems = []; 
var diff = function(arr1, arr2) { 
    var dupes = []; 

    for(var i in arr1) { 
    //console.log(i); 
     for(var j in arr2){ 
      if(arr1[i].name === arr2[j].name){ 
      dupes.push(arr2[j]); 
      } else { 
      originalItems.push(arr2[j]); 
      } 
     }  
    } 
    return dupes; 
} 

var sd = diff(arr1, arr2); 

console.log(sd); 
console.log(originalItems); 

を働いていない、オリジナルのアイテムは、「sunset.jpg」と残りは「dupes」に移動されています。

ここに何か不足しています、手がかり、pls?

+1

あなたは、上記の例から、結果として何を期待していますか? –

+0

私はあなたのコードをjsfiddleにコピーして貼り付けました。結果はあなたが言うものではありません。私は二剤=日の出、自然、ひまわりを得る。残りの部分はオリジナルです。私は何もしませんでした。コピーして貼り付けてください。 – lascort

+0

実際に@Kinduserが正しく動作しません。「originalItems」配列にはすべての項目があります。しかし、その結果は、質問からの結果ではない。しかし、ええ、私の悪い – lascort

答えて

1

arr1に指定された要素が含まれているかどうかを確認し、Array#filterでフィルタリングすると、Array#someArray#everyを使用できます。

var arr1 = [{name: "sunrise.jpg"},{name: "nature.jpg"},{name:"sunflower.jpg"}, {name: "sunset.jpg"}], 
 
    arr2 = [{"@type":"Image","objectTypeId":"Image","baseTypeId":"document","name":"sunrise.jpg","width":"284","height":"177"},{"@type":"Image","objectTypeId":"Image","baseTypeId":"document","name":"Lao Tzu","width":"638","height":"960"},{"@type":"Image","objectTypeId":"Image","baseTypeId":"document","name":"nature.jpg","width":"300","height":"168"},{"@type":"Image","objectTypeId":"Image","baseTypeId":"document","name":"replay_12","width":"500","height":"717"},{"@type":"Image","objectTypeId":"Image","baseTypeId":"document","name":"sunflower.jpg","width":"300","height":"168"}], 
 
    dupes = arr2.filter(v => arr1.some(c => c.name == v.name)), 
 
    originals = arr2.filter(v => arr1.every(c => c.name != v.name)); 
 
    
 
    console.log(dupes); 
 
    console.log(originals);

+1

それは期待された感謝として働いています! – User123

0

機能checkDuplicatesは、二つのその中の配列、第一及び第二の重複nonduplicates物体{}を返します。

function checkDuplicates(array, compareWith) { 
 
    var nonDuplicates = []; 
 
    var duplicates = []; 
 
    
 
    for (i = 0; i < array.length; i++) { 
 
    var element = array[i]; 
 
    var isDuplicate = false; 
 
    
 
    for (j = 0; j < compareWith.length; j++) { 
 
    
 
     var comparedElement = compareWith[j]; 
 
     
 
     if (element.name === comparedElement.name) { 
 
     isDuplicate = true; 
 
     duplicates.push(comparedElement); 
 
     } 
 
     
 
    } 
 
    
 
    if (!isDuplicate) { 
 
     nonDuplicates.push(element); 
 
    } 
 
    
 
    } 
 
    //ES6 would be 
 
    //return { duplicates, nonDuplicates }; 
 
    return {duplicates: duplicates, nonDuplicates: nonDuplicates }; 
 

 

 
} 
 

 
var arr1 = [{name: "sunrise.jpg"},{name: "nature.jpg"},{name:"sunflower.jpg"}, {name: "sunset.jpg"}]; 
 

 
var arr2 = [{ 
 
      "@type" : "Image", 
 
      "objectTypeId" : "Image", 
 
      "baseTypeId" : "document", 
 
      "name" : "sunrise.jpg", 
 
      "width" : "284", 
 
      "height" : "177" 
 
     }, { 
 
      "@type" : "Image", 
 
      "objectTypeId" : "Image", 
 
      "baseTypeId" : "document", 
 
      "name" : "Lao Tzu", 
 
      "width" : "638", 
 
      "height" : "960" 
 
     }, { 
 
      "@type" : "Image", 
 
      "objectTypeId" : "Image", 
 
      "baseTypeId" : "document", 
 
      "name" : "nature.jpg", 
 
      "width" : "300", 
 
      "height" : "168" 
 
     }, { 
 
      "@type" : "Image", 
 
      "objectTypeId" : "Image", 
 
      "baseTypeId" : "document", 
 
      "name" : "replay_12", 
 
      "width" : "500", 
 
      "height" : "717" 
 
     }, { 
 
      "@type" : "Image", 
 
      "objectTypeId" : "Image", 
 
      "baseTypeId" : "document", 
 
      "name" : "sunflower.jpg", 
 
      "width" : "300", 
 
      "height" : "168" 
 
     } 
 
    ]; 
 
    
 
console.log(checkDuplicates(arr1, arr2));

0
var arr1 = ...; 
var arr2 = ...; 

function diff(arr1, arr2) { 
    var dupes = [], 
     originalItems = []; 

    arr2.forEach(function(o2) {    // for each object o2 in arr2 
     var test = arr1.some(function(o1) { // check if there is some object from arr1 that has the same name 
      return o1.name === o2.name; 
     }); 
     if(test)        // if there is 
      dupes.push(o2);     // then push it into the dupes array 
     else         // if not 
      originalItems.push(o2);   // then it is an original 
    }); 

    return {         // return like this is much organized 
     dupes: dupes, 
     originalItems: originalItems 
    }; 
} 

var res = diff(arr1, arr2);     // the result is an object containing two arrays: the dupes one and the originalItems one 

console.log(res.dupes); 
console.log(res.originalItems); 
関連する問題