как перебирать вложенные элементы массива отдельно - PullRequest
0 голосов
/ 16 октября 2018

У меня есть трехмерный массив, например:

var array = [[1,0][3,3][2,1][0,8]]

, и я хочу сделать что-то с первым элементом в каждом подмассиве, но что-то еще свторой элемент в каждом подмассиве.

Так, например, я бы хотел найти сумму array[0][0], array[1][0], array[2][0] и так далее для array.length.Но я хотел бы получить отдельный результат для array[0][1], array[1][1], array[2][1] и т. Д.

Я все еще изучаю javascript (очень медленно) и, если это возможно, я бы хотел указывать в правильном направлении, а не получатьготовое решение.Я искал возможные решения и думаю, что мне может понадобиться вложенный цикл for, но я не уверен, как его структурировать, чтобы получить все значения.

Я что-то пробовалв соответствии с:

for (var i = 0; i < array.length; i++) {
  for (var j = 0; j < array.length; j++) {
    return array[i][j];
  }
}

но я не понимаю, что происходит достаточно хорошо, чтобы манипулировать результатом.

Если кто-нибудь сможет направить меня в правильном направлении к поиску решения, этоБуду очень признателен.

Заранее спасибо.

Ответы [ 8 ]

0 голосов
/ 16 октября 2018
  • Использование отладчика в вашем цикле было бы хорошим способом наблюдать и понимать каждый шаг цикла

  • Использование метода forEach было бы более понятным подходомцикл по массиву и его дочерним элементам

const items = [[1, 0],[3, 3],[2, 1],[0, 8]]
let results = {}

items.forEach((item, index) => {
  // debugger;
  item.forEach((subItem, subIndex) => {
    // debugger;
    if (results[subIndex]) {
      results[subIndex] = results[subIndex] + subItem
    } else {
      results[subIndex] = subItem
    }
  })
})

console.log(results) // { 0: 6, 1: 12 }

// *********EXPLANATION BELOW ************

const items = [[1, 0],[3, 3],[2, 1],[0, 8]]

// store results in its own key:value pair
const results = {}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
// forEach is a more readable way to loop through an array
items.forEach((item, index) => {
  // use console.log(item, index) to see the values in each loop e.g first loop contains `item = [1,0]`
  // you can also use a debugger here which would be the easiest way to understand the iteration
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/debugger
  // debugger;

  // loop over item (e.g [1,0]) to get subItems and their index
  item.forEach((subItem, subIndex) => {

    // get the result from previous sums from `result` 
    // and add them to the current subItem values
    // if there was no previous sum(i.e for first entry) 
    // use subItem as the first value.
    if (results[subIndex]) {
      results[subIndex] = results[subIndex] + subItem
    } else {
      results[subIndex] = subItem
    }

    // Below is a oneliner way to do line 16 to 20 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator
    // results[subIndex] = results[subIndex] ? results[subIndex] + subItem : subItem
  })
})

console.log(results) // { 0: 6, 1: 12 } the results of `array[0][0],array[1][0]...` are in 0 and the result of `array[0][1], array[1][1]...` are in 1 and so on.
0 голосов
/ 16 октября 2018

Во-первых, размещенный вами массив - это 2d-массив, а не 3d-массив.

И размещенный вами вложенный цикл for идеально подходит для того, что вы хотите.Ваша первая оценка - проходить сквозь первое разложение вашего массива.второй получает каждый индекс во втором массиве

var array = [[1,0],[3,3],[2,1],[0,8]]
for (var i = 0; i < array.length; i++) {
  //This loop over these [1,0],[3,3],[2,1],[0,8] 
  //So i on the first loop is this object [1,0] so so on
  for (var j = 0; j < array.length; j++) {
    //This will loop over the i object
    //First loop j will be 1
    //Here is where you would do something with the index i,j. 
    //Right now you are just returning 1 on the first loop
    return array[i][j];
  }
}

Надеюсь, это поможет вашему пониманию

0 голосов
/ 16 октября 2018

Вы можете использовать цикл for...of вместе с деструктурированием следующим образом:

for(let [a, b] of array) {
   // a will be the first item from the subarrays: array[0][0], array[1][0], ...
   // b will be the second: : array[0][1], array[1][1], ...
}

Демонстрация:

let array = [[1, 0], [3, 3], [2, 1], [0, 8]];

for(let [a, b] of array) {
   console.log("a: " + a);
   console.log("b: " + b);
}
0 голосов
/ 16 октября 2018

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

const mainArray = [[1, 0], [3, 3], [2, 1], [0, 8]];

for (let i = 0; i < mainArray.length; i++) {
  const nestedArray = mainArray[i]
  for (let j = 0; j < nestedArray.length; j++) {
    const value = mainArray[i][j]
    switch(j) {
      case 0:
        console.log(`first item of array number ${i+1} has value: ${value}`)
        break;
      case 1:
        console.log(`second item of array number ${i+1} has value: ${value}`)
        break;
    }
  }
}
0 голосов
/ 16 октября 2018

Обязательная однострочная выпечка для лапши.

console.log([[1, 0], [3, 3], [2, 1], [0, 8]].reduce((p, c) => [p[0] += c[0], p[1] += c[1]]));
0 голосов
/ 16 октября 2018

Вам нужен только один цикл for, поскольку у вас есть только один массив с массивами внутри, где вы знаете индексы, которые хотите обработать.Так было бы что-то вроде следующего:

let sum1 = 0;
let sum2 = 0;
for(let i = 0; i < array.length; i++) {
    sum1 += array[i][0];
    sum2 += array[i][1];     
}
console.log('sum1: ', sum1);
console.log('sum2: ', sum2);
0 голосов
/ 16 октября 2018

Поскольку вы обратились за помощью, чтобы указать вам правильное направление, я бы посоветовал вам начать с простого console.logs, чтобы увидеть, что происходит (комментарии встроены):

var array = [[1, 0],[3, 3],[2, 1],[0, 8]];

var results = [0, 0]; // this array is to store the results of our computation

for (var i = 0; i < array.length; i++) { // for each subarray in array
  console.log('examining subarray ', array[i]); 
  for (var j = 0; j < array[i].length; j++) { // for each element in subarray
    if (j === 0) {
      console.log('...  do something with the first element of this array, which is: ' + array[i][j]);
      results[j] += array[i][j]
    } else if (j === 1) {
      console.log('...  do something with the second element of this array, which is: ' + array[i][j]);
      // do some other computation and store it in results
    }
  }
}

console.log('Final results are ', results);
0 голосов
/ 16 октября 2018

Вы можете рассмотреть возможность использования .reduce - на каждой итерации добавьте первое значение массива к свойству аккумулятора и сделайте все, что вам нужно со вторым значением массива, присваивая его результат другому свойству аккумулятора.Например, скажем, для вторых предметов вы хотели получить их товар:

const input = [[1,0],[3,3],[2,1],[0,8]];
const { sum, product } = input
  .reduce(({ sum=0, product=1 }, [item0, item1]) => ({
    sum: sum + item0,
    product: product * item1
  }), {});
console.log(sum, product);

В приведенном выше коде аккумулятор является объектом с двумя свойствами: sum (начинается с 0) и product (начинается с 1).Внутри reduce возвращается объект, новый sum является старым sum плюс первый элемент в массиве, а новый product является старым product, умноженным на второй элемент вмассив.(конечно, результат равен 0, потому что в первом подмассиве второй элемент равен 0)

Также обратите внимание, что массивам всегда нужны запятые, разделяющие каждый элемент массива - вам нужно исправить синтаксис входного массива.

Конечно, вы также можете for циклы, если нужно, но я думаю, что методы массива предпочтительнее, потому что они более функциональны, имеют лучшую абстракцию и не требуют ручной итерации.Тот же код с циклом for будет выглядеть так:

const input = [[1,0],[3,3],[2,1],[0,8]];
let sum = 0;
let product = 1;
for (let i = 0; i < input.length; i++) {
  const [item0, item1] = input[i];
  sum += item0;
  product *= item1;
}
console.log(sum, product);
...