2013-05-09 4 views
1

Извините, если заголовок не так понятен. Это трудно объяснить для меня, поскольку я не так хорош, когда речь заходит о нескольких массивах.Javascript добавляет значения второго массива вместе, если первые значения одинаковы

У меня есть массив: [ [21, 1000], [21, 500], [18, 100], [18, 200] ]

Теперь я хочу, чтобы получить этот результирующий массив: [ [21, 1500], [18, 300] ]

Как я могу идти об этом?

Я попытался с помощью 21 и 18 в виде массива ключи, но этот способ не мог использовать массив в for цикле с .length подсчета. В итоге у меня было всего 4 массива, чтобы заставить его работать.


Edit:

Я хочу, чтобы избежать использования значений 21 и 18 в качестве ключей массива.

Я также хочу, чтобы иметь возможность выполнять итерацию результирующего массива/объекта, а также использовать 21 и 18 «ключи», чтобы внести некоторые дополнительные изменения в мою страницу.

Спасибо уже за ответы!

+0

Вы не можете использовать 'for', но вы можете использовать' .each() 'для объекта. –

+0

Почему бы не сохранить данные как объекты во втором массиве? – Johan

+0

Непонятно, что должно произойти в случае, когда элемент из «первого» не найден во «втором», или в случае, когда есть пара в «секундах», но в «первом» отсутствует соответствующий элемент, , Это может привести к тому, что ряд ответов уже задан неверно. – Xotic750

ответ

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

Я пошел с этим решением, поскольку он позволяет мне перебирать «результаты» и использовать 21/18 «ключи» на моем выходе. – jlmmns

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

+0

Извините, меня перепутали, потому что я писал что-то еще. Порядок второго массива не имеет значения, однако у него есть 2 массива, и он проверяет значения в первом по отношению к значениям во втором. Вы полностью игнорируете первый массив. То, что я имел в виду под выражением 'if', было: что, если у него есть вышеупомянутый массив, но его первый массив выглядит так: [53, 18]'? Это был недостаток иметь дело с первым массивом, который я получал после. – Ryan

+0

@ryan - это была точка объекта. Массивы не имеют ключей, они имеют только индексы, поэтому, создавая объект из значений во втором массиве, было бы тривиально видеть, являются ли значения в первом массиве фактически ключами в объекте, поскольку объекты фактически имеют ключи , – adeneo

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, поэтому вам нужно иметь современный браузер или использовать один из множества «прокладок»/«полиполков».

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

Update: здесь это решение, основанное на обновленном вопросе, это также использует Object.keys и Array.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; 
}
Смежные вопросы