2013-05-09 83 views
1

對不起,如果標題不清楚。這對我來說很難解釋,因爲在多個陣列中我不太好。如果第一個值相同,則Javascript將第二個數組值相加

我有一個數組:[ [21, 1000], [21, 500], [18, 100], [18, 200] ]

現在我想要得到這個結果數組:[ [21, 1500], [18, 300] ]

我如何去這樣做呢?

我已經使用21和18陣列嘗試,但這種方式我不能.length計數在for循環使用數組。我結束了總共4陣列幾乎得到它的工作。


編輯:

我想避免使用21倍18的值作爲數組鍵。

我也希望能夠遍歷結果數組/對象,並使用21和18「鍵」來對頁面進行一些更改。

感謝您的所有答覆!

+0

不能使用'for'但實際上你可以使用'。每()'的對象。 – 2013-05-09 18:03:20

+0

爲什麼不將數據存儲爲第二個數組中的對象? – Johan 2013-05-09 18:05:23

+0

不清楚在「第二」中沒有找到「第一」元素的情況下,或者「第二」中有一對但「第一個」中沒有匹配元素的情況下應該發生什麼情況。 。這可能會使許多已經給出的答案不正確。 – Xotic750 2013-05-09 18:45:32

回答

2

你絕對不需要這方面的任何jQuery得到你要求的結果數組:

var one = [21, 18]; 
var two = [ [21, 1000], [21, 500], [18, 100], [18, 200] ]; 
var results = []; 

for(var i in one) { 
    results[i] = 0; 

    for(var x in two) 
     if(two[x][0] === one[i]) 
      results[i] = results[i] + two[x][1]; 

    results[i] = [one[i], results[i]]; 
} 

Fiddle這裏

+0

我使用了這個解決方案,因爲它允許我遍歷'results'並在我的輸出中使用21/18「keys」。 – jlmmns 2013-05-09 19:32:03

6

如何創建一個對象:

var arr = [ [21, 1000], [21, 500], [18, 100], [18, 200] ]; 
    obj = {}; 

for (i=0; i<arr.length; i++) { 
    obj[arr[i][0]] = (obj[arr[i][0]] || 0) + arr[i][1]; 
} 

// obj now equals {18: 300, 21: 1500} 
// obj[21] equals 1500 etc 

FIDDLE

你可以創建一個數組以同樣的方式:

var arr = [ [21, 1000], [21, 500], [18, 100], [18, 200] ], 
    arr2 = []; 

for (i=0; i<arr.length; i++) { 
    arr2[arr[i][0]] = (arr2[arr[i][0]] || 0) + arr[i][1]; 
} 

// giving you the array [18: 300, 21: 1500] 
// where arr2[18] equals 300 
+0

@ryan - 不知道我明白了,爲什麼不能這麼做 - > [Fiddle](http://jsfiddle.net/AF4Tt/1/)?陣列中的順序並不重要! – adeneo 2013-05-09 18:12:41

+0

對不起,我被混淆了,因爲我正在寫點別的東西。第二個數組的順序並不重要,但是,他有兩個數組,他正在檢查第一個數值與第二個數值。你完全忽略了第一個數組。 「if」語句的含義是:如果他有上述數組,但他的第一個數組看起來像這個'[53,18]'?這是缺乏處理我遇到的第一個陣列。 – Ryan 2013-05-09 18:19:03

+0

@ryan - 那是對象的要點。數組沒有鍵,它們只有索引,所以根據第二個數組中的值創建一個對象,查看第一個數組中的值是否實際上是對象中的鍵是很微不足道的,因爲對象實際上有鍵。 – adeneo 2013-05-09 18:33:58

0

的情況下,你的價值觀是不是爲了,你可以使用這個:

小提琴:
http://jsfiddle.net/acturbo/YWaja/

javasript:

var array1= [21, 18]; 
var array2 = [ [21, 1000], [21, 500], [18, 100], [18, 200] ]; 
var result = [ [0,0], [0,0] ]; 

for (i=0;i<array1.length;i++){ 

    result[0,i][0] = array1[i]; 

    for (j=0;j<array2.length;j++){ 

     var key = array2[i,j][0]; 
     var val = array2[i,j][1]; 

     if ( key == array1[i]){ 
      result[0,i][1] += val; 
     } 
    } 
} 
0

這裏是另一種可能性,它是usi ng Array.forEach,所以你需要有一個現代化的瀏覽器或使用其中的許多「墊片」/「polyfills」。

的Javascript

var first = [21, 18], 
    second = [ 
     [21, 1000], 
     [21, 500], 
     [18, 100], 
     [18, 200] 
    ], 
    store = {}; 
    result = []; 


first.forEach(function (element) { 
    second.forEach(function (pair) { 
     var value; 

     if (pair[0] === element) { 
      value = store[element] || 0; 
      store[element] = value + pair[1]; 
     } 
    }); 

    if (typeof store[element] === "number") { 
     result.push([element, store[element]]); 
    } 
}); 

console.log(result); 

jsfiddle

更新:這裏是基於更新的問題的解決方案,這也採用Object.keysArray.map從對象做轉換到陣列格式的OP已經要求。

的Javascript

var first = [ 
     [21, 1000], 
     [21, 500], 
     [18, 100], 
     [18, 200] 
    ], 
    store = {}; 
    result; 

first.forEach(function (pair) { 
    store[pair[0]] = (store[pair[0]] || 0) + pair[1]; 
}); 

result = Object.keys(store).map(function (key) { 
    return [parseInt(key, 10), store[key]]; 
}); 

console.log(result); 

jsfiddle

0
function aggregateResults(indexes, inputArray) { 
    var ret = [], tmp; 
    for (var i=0; i<indexes.length; i++) { 
    tmp = 0; 
    for (var j=0; j<inputArray.length; j++) { 
     tmp += inputArray[j][0] == indexes[i] ? inputArray[j][1] : 0; 
    } 
    ret.push([indexes[i], tmp]) 
    } 
    return ret; 
}
相關問題