Как использовать вложенные массивы с a для l oop in javascript - PullRequest
1 голос
/ 03 февраля 2020

Моя цель для этого состоит в том, чтобы иметь возможность доступа к свойствам вложенного массива в a для l oop, например, для данного массива.

[[1 , "one"],
[0.2 , "two"],
[0.3 , "three"]]

Я бы хотел иметь доступ к индексу 0 по всем oop.

Мой текущий способ сделать это:

function printArray() {
  for (var i = arguments.length; i >= 0; i--) {
    print(arguments[i][0]);
  }
}

Как когда-либо это приводит к этой ошибке

Uncaught TypeError: Cannot read property '0' of undefined

Когда я ожидал

0.3
0.2
1

Каков правильный способ зацикливания над вложенным массивом?

Ответы [ 4 ]

1 голос
/ 03 февраля 2020

Есть несколько способов l oop через массив.

Какой из них лучший?

Это зависит от того, для чего он используется, и субъективности.

Вот некоторые из них.

let arr = [[1 , "one"], [0.2 , "two"], [0.3 , "three"]];

// forEach loop
console.log('forEach loop');
arr.forEach((x, idx) => {
    console.log(x[0]);
});

//for of loop
console.log('for-of loop');
for (elem of arr){
   console.log(elem[0]);
}

//for in loop
console.log('for-in loop');
for (idx in arr){
    console.log(arr[idx][0]);
}

// old-school for loop
console.log('for loop');
for (let i = 0; i < arr.length; i++) { 
    console.log(arr[i][0]); 
}

// while loop
console.log('while loop');
let i = 0;
while (i < arr.length) {
    console.log(arr[i][0]);
    i++;
}

// do while loop
console.log('do while loop');
let j = 0;
do {
    console.log(arr[j][0]);
    j++;
} while (j < arr.length);

Но о вашей функции.
1) лучше передать массив как переменную.
2) последний индекс массива это его длина - 1

Так что если вы хотите что-то, что работает даже в старых браузерах.

К l oop в порядке возрастания индекса:

function printArray(arr) {
  for (var i = 0; i < arr.length; i++) {
    print(arr[i][0]);
  }
}

К l oop в порядке убывания индекса:

function printArray(arr) {
  for (var i = arr.length - 1; i >= 0; i--) {
    print(arr[i][0]);
  }
}
1 голос
/ 03 февраля 2020

Используйте for/of для итераций, чтобы вам не приходилось даже беспокоиться о разыменовании индекса.

function printArray () {
  for (const arg of [...arguments]) {
    for (const nestedArg of arg) {
      console.log(nestedArg);
    }
  }
};

printArray([
  [1, "one"],
  [0.2, "two"],
  [0.3, "three"]
]);
1 голос
/ 03 февраля 2020

На первой итерации i = 3, что выходит за границы массива, если используется как индекс

let args = [
  [1, "one"],
  [0.2, "two"],
  [0.3, "three"]
];

for (let i = args.length - 1; i >= 0; i--) {
  console.log(args[i][0]);
}
0 голосов
/ 03 февраля 2020

arguments - это массив аргументов, передаваемых в функцию, в вашем случае вы должны указать на первый элемент массива аргументов следующим образом:

let data = [[1 , "one"],
    [0.2 , "two"],
    [0.3 , "three"]];


function printArray() {
  for (var i = arguments[0].length -1 ; i >= 0; i--) {
    console.log(arguments[0][i][0]);
  }
}

printArray(data);

Ошибка:

Uncaught TypeError: Невозможно прочитать свойство '0' из неопределенного

с аргументами формы .length, что приведет к ошибке индекса вне массива

...