2017-06-07 2 views
0

関連する2つの配列を取ろうとしていますが、一意の値を取得するためにフィルタをかけ、一意の値の合計を持つ必要があります。配列1のインデックスは配列2のインデックスと一致し、合計を得るためにすべての値を一緒に追加する必要があります。一意の配列エントリと別の配列からの関連エントリの合計を表示

アレイ1:例えば

var arr1 = [7012, 7013, 7015, 7012]; 

アレイ2:

var arr2 = [10, 20, 25, 10]; 

期待出力:

(最初の説明はこれを変更、大きくなかった)

newArray1 = [7012, 7013, 7015]; 
newArray2 = [20, 20, 25]; 

注:私はあなたですFirebaseを使って配列に値を取得すると、これらはインデックスに設定されません。

私は、ユニークな値取得するために、設定を()を使用しています:

var newArr = [...new Set(arr1)]; 

完全に正常に動作します。

私が抱えている問題は、配列2から関連する値を取得して合計を得ることです。 .reduce()を使用して罰金を作成することはできますが、Array 2の値を配列1に関連するものに基づいて新しい配列に取得する方法がわかりません。

+0

等しい配列1における同じ値の値がありますか?なぜ配列2にSetを使用しないのですか?ユニークな値を追加しますか? –

+0

合計は? arr [0] + arr2 [0]または何ですか?配列の長さが異なるとどうなりますか?なぜあなたはこれを必要としますか(XYの問題かもしれません) –

+0

あなたの例はあなたの期待される出力を表示しません。それはあなたの合計に含めることを希望する値は明確ではありません。 – Paulpro

答えて

0

私が正しく理解していればあなたはユニークな値のための配列2からのそれぞれの合計が含まれます配列をしたいです配列1の。 Mapを使用すると、一意の値と対応する合計を取得できます。 Map#valuesを使用すると、array1の一意の値を取得するためにarray2,Map#keysの合計を取得し、一意の値と合計のタプルを得るにはmap#entriesを取得できます。

const arr1 = [7012, 7013, 7015, 7012]; 
 
const arr2 = [10, 20, 25, 10]; 
 

 
const map = arr1.reduce((map, v, i) => { 
 
    const sum = map.get(v) || 0; 
 
    
 
    return map.set(v, sum + arr2[i]); 
 
}, new Map()); 
 

 
const arr1Unique = [...map.keys()]; 
 
const arr2Sums = [...map.values()]; 
 
const tuples = [...map.entries()]; 
 

 
console.log(arr1Unique); 
 
console.log(arr2Sums); 
 
console.log(tuples);

+0

はい、ありがとうございます。私の説明はあまり良くはありませんでしたが、あなたはそれを得ました。私はあなたがこのように地図を使うことができるかどうかはわかりませんでした。 –

0

Mapを入力し、対応する値をarray1という同じキーで保存します。その後、合計の値を取得します。私の知る限り、あなたがグループにしたい、あなたを理解し、ARR1で等しい値に基づいて、ARR2をまとめるよう

var array1 = [7012, 7013, 7015, 7012], 
 
    array2 = [10, 20, 25, 10], 
 
    map = array1.reduce((m, k, i) => (m.set(k, (m.get(k) || 0) + array2[i])), new Map), 
 
    sum = [...map.values()].reduce((r, v) => r + v, 0); 
 

 
console.log([...map]); 
 
console.log(sum);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

array2の一意の値の合計を取得する必要がある場合、それは正常に動作します。アレイ1の各ユニークな値に対して正しい合計を得ることができるように、配列2の値がユニークでないようにする必要があります。 –

0

。だから、ハッシュテーブルを作成することがあります。

var arr1 = [7012, 7013, 7015, 7012]; 
var arr2 = [10, 20, 25, 10]; 

var obj={}; 
arr1.forEach(function(el,i){//el is a value of arr1 at index i, e.g. 7012,0 
    obj[el]=obj[el]||0;//initialise obj[7012] 
    obj[el]+=arr2[i]||0;//increase obj[7012] by arr2[0] so 10 
}); 

console.log(obj); 

が作成されます:

{ 
7012:20, 
7013:20, 
7015:25 
} 
0

をあなたはARR2の対応する位置の値を使ってユニークな配列の値を置き換えるためにmapを使用して、使用することができますreduce合計を取得するには:

const sum = [...new Set(arr1)]. 
    map(x => arr2[ arr1.indexOf(x) ]). 
    reduce((a, b) => a + b, 0) 
; 
関連する問題