2017-09-25 9 views
-1

2つの配列をオブジェクトの配列に結合しようとしています。2つの配列をオブジェクトの配列に結合し、重複を数えて返します。

例:私は、これら2つを組み合わせていたいのです

arr1 = [a,b,c]; 
arr2 = [a,a,a,b,b,c,d,d]; 

方法:ARR1に保存された値のみが統合されるべきであることを

combinedArr = [ 
    {name: a, amount: 3}, 
    {name: b, amount: 2}, 
    {name: c, amount: 1} 
]; 

注意、中に存在しない任意のARR2値arr1はちょうど残されています。

また、私はAfter EffectsのExtendscriptでこれを使用してECMA-262標準の第3版に制限し、古い古典的なjavascriptを残すことが重要です。連結、スライス、結合などの機能は利用できません。

私は方法を試しましたが、私はそれを理解することはできません。私は、アレイを介してわずか2〜3個のスマートループで解決策を達成できると確信しています。事前に

おかげで、 サイモン

EDIT: 私は私の問題で自分の試みを追加しないことで混乱を作成しました。申し訳ありませんが、私はそれを一晩考えていて、列車の電話でこの質問を書いています。

私は私の質問について悪意を持っていなかったことを証明するために、私が以前に書いたことを簡単にはしませんが、実際のコードから投稿します。 :

var createMarkerList = function() { 
    var subList = _createMarkerListSub(); //in this example arr1 
    var masterList = _createMarkerListMaster(); //in this example arr2 
    var output = []; 

    for(var i=0;i<subList.length;i++){ 
     var uniqueMarker = subList[i]; 
     output.push({ 
      name: uniqueMarker, 
      amount: 0, 
     }); 
    } 

    for(var i=0;i<masterList.length;i++){ 
     var genericMarker = masterList[i]; 

     if(output[i].name == genericMarker){ 
      output[i].amount = output[i].amount +1; 
     } 
    } 
} 

私は単にいくつかの理由のためにそれのまわりで私の頭を取得できませんでした、私はちょうどそれを理解しようとせずに答えをお願いすることによって周りの簡単な方法を取得しようとdid'tますのでご注意ください。

+3

あなたは何をしようとしたことがありますか? – Rajesh

+0

私はRajeshに同意します。これは基本的なものなので、最初にjavascriptチュートリアルを読むことをお勧めします。 – Verthosa

+0

@Simon、あなたの努力を分かち合うことは非常に重要です。 *コード/アルゴリズム/検索されたリンク*にすることができます。あなたがそれを共有しない限り、あなたは問題の声明ではなく要件のように見えます。これにより、望ましくない票/コメントが集まる可能性があります。 – Rajesh

答えて

2

両方の配列を繰り返し処理し、arr1のすべての要素の数を保持する必要があります。

var arr1 = ['a','b','c']; 
 
var arr2 = ['a','a','a','b','b','c','d','d']; 
 
var combinedObject= {}, combinedArray = []; 
 
for(var i=0; i<arr1.length; i++) 
 
    combinedObject[arr1[i]] = 0; 
 

 
for(var i=0; i<arr2.length; i++) 
 
    if(combinedObject.hasOwnProperty(arr2[i])) 
 
combinedObject[arr2[i]]++; 
 

 
for(var key in combinedObject) 
 
    combinedArray.push({'name': key, 'amount':combinedObject[key]}); 
 

 
console.log(combinedArray);

+1

入力の兆候がないような質問に答えるべきでしょうか? – Rajesh

+0

@Rajeshは議論の余地があるかもしれないが、OPがそれを行う方法を得ていない可能性があるので、その答えが彼の理解を助けるだろう。 OPが見た目になり、単にそれをコピーするのではなく、その解決策を理解しようとすることを望むことができます。他の選択肢は、質問を無視することですが、それは誰にも助けにはなりません。 – Dij

+1

@Dijはい、それは議論の余地がありますが、OPは彼の試行も見せていません。 OPは「私は自分の道を試みたが、私はそれを理解できない」と述べたが、彼が試みたことは示していなかった。 – gurvinder372

1

あなたはハッシュテーブルを使用して、カウントのためにそれを使用することができます。

arr1をループして、ハッシュテーブルと結果セットを作成し、項目の上に2番目のループを作成して、amountプロパティをカウントしてインクリメントする必要があります。

var arr1 = ['a', 'b', 'c'], 
 
    arr2 = ['a', 'a', 'a', 'b', 'b', 'c', 'd', 'd'], 
 
    hash = {}, 
 
    result = [], 
 
    i; 
 
    
 
for (i = 0; i < arr1.length; i++) { 
 
    hash[arr1[i]] = { name: arr1[i], amount: 0 }; 
 
    result.push(hash[arr1[i]]); 
 
} 
 

 
for (i = 0; i < arr2.length; i++) { 
 
    hash[arr2[i]] && hash[arr2[i]].amount++; 
 
} 
 

 
console.log(result);

+0

ありがとう!両方の答えはうまくいったが、私はハッシュテーブルを知らなかった。私はそれを読むよ! –

関連する問題