2016-04-14 4 views
0

この質問は、this questionと似ている可能性があります。数時間前に尋ねましたが、私が苦労していた問題は、思想。私は、2つのオブジェクトが同じプロパティと値のセットを持っていても、2つのオブジェクトがJavaScriptで同じであるとはみなされないという事実を認識していませんでした。複製オブジェクト用のオブジェクトの2つの配列を比較し、JavaScriptで重複していないときに押します

私はこのようなオブジェクトの2つの配列をJavaScriptに持っています。私が何をしたいか

var from = [ 
    {city: "seoul", country: "korea"}, 
    {city: "tokyo", country: "japan"}, 
    {city: "beijing", country: "china"}, 
    {city: "new york", country: "usa"} 
]; 
var to = [ 
    {city: "seoul", country: "korea"}, 
    {city: "tokyo", country: "japan"}, 
    {city: "toronto", country: "canada"} 
]; 

は、オブジェクトのいずれかの場合、配列は「へ」のアレイ内にすでに存在すると、それはでない場合にのみ、「へ」の配列にオブジェクトをプッシュする「から」で確認することです"to"配列にない他のオブジェクトが "from"配列にあっても、 "from"配列から "to"配列にオブジェクトを1つだけ追加したいと考えています。言い換えれば、オブジェクトが「to」配列にプッシュされるとすぐにループから抜け出したいと思っています。

最後に、「to」配列をこのようにしたいと思います。

var target = { 
    {city: "seoul", country: "korea"}, 
    {city: "tokyo", country: "japan"}, 
    {city: "toronto", country: "canada"}, 
    {city: "beijing", country: "china"} 
}; 

ここで私がこの効果を達成するために考え出した機能です。

function ruthere (source, target) { 
    for (var i = 0; i < target.length; i++) { 
     for (var j = 0; j < source.length; j++) { 
      if (target[i].city == source[j].city) { 
       console.log("Already there"); 
      } else { 
       target.push(source[j]); 
       i = target.length-1; 
       break; 
      } 
     } 
    } 
} 

これは私が望む結果を達成した限りですが、これはまだ私が望むことをしません。

*編集:オブジェクトの名前プロパティの値が同じかどうかを確認するだけです。 countryプロパティの値は同じである必要はありません。

+0

サンプル・オブジェクトは、 "名前" プロパティを持っていない '(ターゲット[i]を.name'。おそらく、これは読みたい'(ターゲット[i]が.city' – Hamms

+0

@ハムムズは申し訳ありませんでした。 – oosniss

+1

また、 'break'は最も内側の' for'ループから抜け出すだけで、両方ではなく 'return'になります。 – Hamms

答えて

2

あなたのコードと間違っていくつかのこと:あなたが必要なのですネストされたループですが、なぜここでそれをやっているのか分かりません。ターゲット配列内の都市がソース配列内の都市とまったく同じでない場合、いくつかはターゲット配列にプッシュされることはありません。都市は同じ名前を持つこともできますが、異なる国にあることもあります。

function ruthere(source, target) { 
    for (var i = 0; i < source.length; i++) { 
     var srcObj = source[i]; 
     var tarObj = target.find(function (obj) { 
      return obj.city === srcObj.city && obj.country === srcObj.country; 
     }); 

     if (!tarObj) { 
      target.push(srcObj); 
      break; 
     } 
    } 

    return target; 
} 

編集:あなたはES5の機能を使用できると仮定すると、

私はArray.prototype.findがES6、ないES5で、誤解です。ここにES3バージョンがあります:

+1

'.find'はES6(ES5ではなく)の配列メソッドではありませんか? – litel

+0

IEやOperaで 'find'が現在サポートされていません – 4castle

+0

@kpimovこれはうまくいきました。ご回答有難うございます。 – oosniss

-2

私はあなたがこれを達成するためにアンダースコア使用になります Underscore.js

この答えは、おそらく非常に有用な答えになります。 https://stackoverflow.com/a/28632359/5768113

+0

この回答の一部は実際には答えていません。 – 4castle

+0

私の間違いとして、あるオブジェクトを繰り返し処理し、それが別のオブジェクトに存在するかどうかをチェックしたいと思っていました。私が提供した答えが役に立たなかったと思うのは間違いかもしれません。私の悪い。 – Deacan

+0

それは役に立つリンクです。しかし、StackOverflowでは、単にリンクの回答を投稿することはできません。リンクに記載されている内容とOPの質問に答えるためにどのように使用できるかを含める必要があります。 – 4castle

1

var from = [{ 
 
    city: "seoul", 
 
    country: "korea" 
 
}, { 
 
    city: "tokyo", 
 
    country: "japan" 
 
}, { 
 
    city: "beijing", 
 
    country: "china" 
 
}, { 
 
    city: "new york", 
 
    country: "usa" 
 
}]; 
 
var to = [{ 
 
    city: "seoul", 
 
    country: "korea" 
 
}, { 
 
    city: "tokyo", 
 
    country: "japan" 
 
}, { 
 
    city: "toronto", 
 
    country: "canada" 
 
}]; 
 

 
function ruthere(source, target) { 
 
    for (var i = 0; i < source.length; i++) { 
 
     if (source[i].city !== target[i].city) { 
 
      target.push(source[i]) 
 
     } 
 
    } 
 
    for (var i = 0; i < target.length; i++) { 
 
\t \t $(".city").append((i + 1) + " " + target[i].city + "<br>") 
 
    } 
 
} 
 
ruthere(from, to)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="city"></div>

+0

コードのみの回答は役に立ちません。あなたはOPの問題(質問ではっきりしていない)とあなたの答えがそれをどのように修正するのか説明する必要があります。それ以外の場合は、無料のコーディングサービスです。 – RobG

関連する問題