У меня есть список массивов в этом формате

 data = [[1,2,3,4,5,6,7,8,9,10],
 [11,12,13,14,15,16,17,18,19,20],
 [21,22,23,24,25,26,27,28,29,30]]

Я хочу вывод в этом формате

    [[11/1, 12/2,13/3,14/4,15/5,16/6,17/7,18/8,19/9,20/10],
     [21/11,22/12,23/13,24/14,25/15,26/16,27/17,28/18,29/19,30/20]]

Я использовал для цикла, и это выглядит так

const totalData = data.length;
for(var i =0 ; i < totalData ; i++){
  for(var j =0; j < data[i].length; j++){
    console.log(data[i+1][j]/data[i][j]);
  }
}

Я хочу преобразовать это, используя карту JavaScript и уменьшить? есть ли возможные способы? Спасибо

0
Bharat Paudyal 30 Авг 2017 в 22:21

4 ответа

Лучший ответ

Циклы for не являются плохой практикой, они просто не вписываются в функциональный стиль программирования. Следующее решение предполагает, что длины массивов равны:

const data = [
  [1,2,3,4,5,6,7,8,9,10],
  [11,12,13,14,15,16,17,18,19,20],
  [21,22,23,24,25,26,27,28,29,30]
];

const result = data.map((arr, index) => {
  const next = data[index + 1];
  if (!Array.isArray(next)) {
    return;
  }
  return arr.map((item, i) => next[i] / item);
}).filter(Boolean);

console.log(result);

Я уверен, что вы можете понять, что делать, если длины массивов не равны.

2
PeterMader 30 Авг 2017 в 19:36

Вы можете использовать единственное уменьшение и отобразить элементы для нового массива.

var data = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]],
    result = [];

data.reduce((a, b) => (result.push(a.map((c, i) => b[i] / c)), b));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 30 Авг 2017 в 20:45

Если длины не равны, элементы в хвосте более длинного игнорируются.

data = [
  [1,2,3,4,5,6,7,8,9,10],
  [11,12,13,14,15,16,17,18,19,20],
  [21,22,23,24,25,26,27,28,29,30]
];

result = data.reduce((acc,current,i)=>{
      var ret;
      if(data[i].length <= data[i-1].length)
        ret = data[i].map((item,j)=>(item / data[i-1][j]));
      else
        ret = data[i-1].map((item,j)=>(data[i][j] / item));
      if(i==1)
        return [ret]
      else
        return acc.concat([ret])
})
console.log(result)
0
TCPN 30 Авг 2017 в 19:51

Вам необходимо создать отдельные функции для каждой задачи:

/**
 * Combine 2 arrays
 * @param Array a 
 * @param Array b 
 */
function combineArrays(a, b) {

    var combined = [];

    for (var i = 0; i < a.length; i++)
        combined.push(a[i] / b[i]);

    return combined;
}

/**
 * Combine an group of arrays
 * @param Array group 
 */
function combineGroup(group) {
    var newGroup = [];
    for (var i = 0; i < group.length - 1; i++)
        newGroup.push(combineArrays(group[i], group[i + 1]));

    return newGroup;

}

Первая функция объединяет только 2 массива. Вторая функция объединяет множество массивов и возвращает то, что вы хотите.

0
Maxwell s.c 30 Авг 2017 в 19:48