рассчитать конкретную позицию массива в JavaScript ES5 - PullRequest
0 голосов
/ 12 мая 2018

У меня есть двумерный массив.Я хочу вычислить сумму каждого значения позиции индекса.

var arr = [['abc',2,5,'xyz'],['def',7,11,'mno'],['ghi',23,12,'pqr'],['hij',66,90,'uvw']]

Я хочу вычислить 2-ю и 3-ю позицию каждого массива и хочу получить новый массив.

var newArr = [total, (2+7+23+66), (5+11+12+90), (2+7+23+66+5+11+12+90)]
newArr = [total, 98, 118 , 216  ]

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Вы можете сделать это в O (n) с помощью Reduce

var arr = [['abc',2,5,'xyz'],['def',7,11,'mno'],['ghi',23,12,'pqr'],['hij',66,90,'uvw']]

var sums = arr.reduce(function(result, row, i){
  result[1] += row[1];
  result[2] += row[2];
  return result
}, ['total', 0, 0])

sums[3] = sums[2] + sums[1]

console.log(sums) // ["total", 98, 118, 216]
0 голосов
/ 12 мая 2018

С одним forEach не нужно использовать множественный цикл for (n).

var arr = [['abc',2,5,'xyz'],['def',7,11,'mno'],['ghi',23,12,'pqr'],['hij',66,90,'uvw']];

var ff =0;
var ss =0;
arr.forEach(function(val){
    ff += val[1]
    ss += val[2]
})
console.log(ff, ss, ff+ss)
0 голосов
/ 12 мая 2018

Просто forEach над массивами внутри, извлекая нужные значения и складывая их:

var arr = [['abc',2,5,'xyz'],['def',7,11,'mno'],['ghi',23,12,'pqr'],['hij',66,90,'uvw']];
var sumElms = {};
arr.forEach(function(arr) {
  arr.forEach(function(elm, i) {
    sumElms[i] = (sumElms[i] || 0) + elm;
  });
});
var newArr = ['total', sumElms[1], sumElms[2], sumElms[1] + sumElms[2]];
console.log(newArr);

Вы также можете просто заполнить reduce и полностью соответствовать ES5:

if (!Array.prototype.reduce) {
  Object.defineProperty(Array.prototype, 'reduce', {
    value: function(callback /*, initialValue*/) {
      if (this === null) {
        throw new TypeError( 'Array.prototype.reduce ' + 
          'called on null or undefined' );
      }
      if (typeof callback !== 'function') {
        throw new TypeError( callback +
          ' is not a function');
      }

      // 1. Let O be ? ToObject(this value).
      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0; 

      // Steps 3, 4, 5, 6, 7      
      var k = 0; 
      var value;

      if (arguments.length >= 2) {
        value = arguments[1];
      } else {
        while (k < len && !(k in o)) {
          k++; 
        }

        // 3. If len is 0 and initialValue is not present,
        //    throw a TypeError exception.
        if (k >= len) {
          throw new TypeError( 'Reduce of empty array ' +
            'with no initial value' );
        }
        value = o[k++];
      }

      // 8. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kPresent be ? HasProperty(O, Pk).
        // c. If kPresent is true, then
        //    i.  Let kValue be ? Get(O, Pk).
        //    ii. Let accumulator be ? Call(
        //          callbackfn, undefined,
        //          « accumulator, kValue, k, O »).
        if (k in o) {
          value = callback(value, o[k], k, o);
        }

        // d. Increase k by 1.      
        k++;
      }

      // 9. Return accumulator.
      return value;
    }
  });
}
var arr = [['abc',2,5,'xyz'],['def',7,11,'mno'],['ghi',23,12,'pqr'],['hij',66,90,'uvw']];
var newArr = arr.reduce(function(accum, arr, i) {
  accum[1] += arr[1];
  accum[2] += arr[2];
  accum[3] += arr[1] + arr[2];
  return accum;
}, ['total', 0, 0, 0]);
console.log(newArr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...