2016-11-30 2 views
1

Как я могу суммировать все те же элементы в одном массиве? Например, у меня есть массив:Сумма всех одинаковых элементов в одном массиве

[20,20,20,10,10,5,1] 

Как я могу сделать это [60,20,5,1]?

Вот что я пытался до сих пор:

var money = [20, 20, 20, 10, 10, 5, 1]; 
for (var i = 0; i < money.length; i++) { 
    if (money[i] == money[i + 1]) { 
    money[i] += money[i + 1]; 
    money.splice(money.indexOf(money[i + 1]), 1); 
    } 
} 
+4

Что вы пробовали? – PMerlet

+1

Вы уверены, что дубликаты будут вместе? –

+0

для (var i = 0; i

ответ

2

Используйте Array#reduce метод с переменной для хранения предыдущего элемента.

var arr = [20, 20, 20, 10, 10, 5, 1]; 
 
// variable for storing previous element 
 
var prev; 
 

 
var res = arr.reduce(function(arr, v) { 
 
    // if element is same as previous then add 
 
    // value with last element 
 
    if (prev == v) 
 
    arr[arr.length - 1] += v; 
 
    // else push and update prev variable 
 
    else 
 
    arr.push(prev = v) 
 
    // return the array refernece 
 
    return arr; 
 
    // set initial value as empty array for result 
 
}, []) 
 

 
console.log(res);


ОБНОВЛЕНИЕ: Если же значения не являются смежными затем использовать объект для обозначения индекса.

var arr = [20, 20, 20, 10, 10, 5, 1]; 
 
// object for refering index 
 
var ref = {}; 
 

 
var res = arr.reduce(function(arr, v) { 
 
    // check property is defined or not if 
 
    // defined update value at the index 
 
    if (ref.hasOwnProperty(v)) 
 
    arr[ref[v]] += v; 
 
    else { 
 
    // else add property to object and push element 
 
    ref[v] = arr.length; 
 
    arr.push(prev = v) 
 
    } 
 
    // return array reference 
 
    return arr; 
 
    // set initial value as empty array for result 
 
}, []) 
 

 
console.log(res);

4

Я хотел бы сделать что-то вроде этого:

  1. граф вхождений.
  2. Умножьте значение с помощью вхождений.

Сниппет

// Our original array. 
 
var arr = [20, 20, 20, 10, 10, 5, 1]; 
 
// Let's have a counts object that stores the counts. 
 
var counts = {}; 
 

 
// Loop through the array to get the counts. 
 
for (var i = 0; i < arr.length; i++) { 
 
    var num = arr[i]; 
 
    counts[num] = counts[num] ? counts[num] + 1 : 1; 
 
} 
 

 
// Have a final array. 
 
var fin = []; 
 
// Multiply the count with the values and push it to the final array. 
 
for (var count in counts) { 
 
    fin.push(counts[count] * count); 
 
} 
 

 
console.log(fin);

+0

объясните этого человека – Mahi

+0

@Mahi Почему вы не видите комментарии? Какой из них вы не понимаете? –

+0

спасибо за ответ, но я довольно молодой разработчик.я не утверждаю, что эта часть подсчета [num] = counts [num]? count [num] + 1: 1; –

0

Вы можете использовать хэш-таблицу и сохранить индекс слота результата. Это работает и для несортированных значений.

var data = [20, 20, 20, 10, 10, 5, 1], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    if (!(a in this)) { 
 
     this[a] = result.push(0) - 1; 
 
    } 
 
    result[this[a]] += a; 
 
}, Object.create(null)); 
 
    
 
console.log(result);

1
var list= [20,20,20,10,10,5,1]; 
var result=[]; 
//index of already added values 
var listOfIndex=[]; 
for(var i=0;i<list.length;i++){ 
if(listOfIndex.indexOf(i)>=0){ 
    continue; 
} 
var number=list[i]; 
for(var j=i+1;j<list.length;j++){ 
if(list[i]==list[j]){  
    number = number+list[j]; 
    listOfIndex.push(j);//push in this list the index of the value that has been added 
    } 
} 
result.push(number); 
} 
console.log(result); 
+0

нет, не бог –

+0

см. Мое обновленное решение. – Alee

0

Еще одно предложение однопетлевого с помощью Array.prototype.reduce и hash table, которые хранят индексы массива результата будучи созданными - будет обрабатывать входные данные, которые не отсортированные тоже.

Смотреть демо ниже:

var array = [20, 20, 20, 10, 10, 5, 1]; 
 

 
var result = array.reduce(function(hash){ 
 
    return function(p,c) { 
 
    if(c in hash) { 
 
     p[hash[c]] += c; 
 
    } else { 
 
     // store indices in the array 
 
     hash[c] = p.push(c) - 1; 
 
    } 
 
    return p; 
 
    }; 
 
}(Object.create(null)),[]); 
 

 
console.log(result);