Почему JS передает число в массив в виде строки? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь получить // [2,6,0,8,4] из функции:

let getValidPassword = arr => {
  let x = [];
  for (let i in arr) {
    for (let j in arr[i]) {
      if (arr[i][j] % 2 !== 0) {
        break;
      } else {
        x += arr[i][j];
      }
    }
  }
  return x
};

var loggedPasscodes = [
  [1, 4, 4, 1],
  [1, 2, 3, 1],
  [2, 6, 0, 8],
  [5, 5, 5, 5],
  [4, 3, 4, 3]
];
console.log(getValidPassword(loggedPasscodes)); 

Однако, когда я запускаю typeof x, я получаю строку (Я думал, что это число) и когда я печатаю x, я получаю 26084 вместо [26084], что это за колдовство? Я, хотя установка х в [] сделает трюк ... спасибо.

Ответы [ 3 ]

0 голосов
/ 25 октября 2019

Когда вы объединяете массив (что и делает +=), он сначала преобразует массив и значение, добавляемое в строки.

Для добавления элементов в массив x используйте x.push(arr[i][j]), это вставит их без преобразования типа.

0 голосов
/ 25 октября 2019

Проблема в том, что вы объявили x=[], но измените его как x += arr[i][j];, как только javascript попадет на эту строку. Он обрабатывает массив как строку, вызывающую x.toString() внутри и добавляющую к этой строке. Например, если вы объявите массив как a=[] и вызовете a+=1, тогда a станет "1". В javascript все типизировано по значению, не имеет значения, что вы объявляете, когда присваиваете ему какое-либо значение или выполняете какую-либо операцию над переменной, оно преобразуется в тип значения.

Я бы порекомендовал вам пройти через это

let getValidPassword = arr => {
	let x = [];
	let temp = [];
	for (let i in arr) {
		for (let j in arr[i]) {
			if (arr[i][j] % 2 !== 0) {
				break;
			} else {				
				temp.push(arr[i][j]);				
			}
			if(temp.length == arr[i].length)
				x = temp.slice(); 
		}
	}
	return x
};

var loggedPasscodes = [
[1, 4, 4, 1],
[1, 2, 3, 1],
[2, 6, 0, 8],
[5, 5, 5, 5],
[4, 3, 4, 3]
];
console.log(getValidPassword(loggedPasscodes)); 
0 голосов
/ 25 октября 2019

Проблема в том, что вы увеличиваете свою переменную, чтобы добавить элемент в массив, вам нужно использовать метод push().

Правильный код:

let getValidPassword = arr => {
  let x = [];
  for (let i in arr) {
    for (let j in arr[i]) {
      if (arr[i][j] % 2 !== 0) {
        break;
      } else {
        x.push(arr[i][j]);
      }
    }
  }
  return x
};

var loggedPasscodes = [
  [1, 4, 4, 1],
  [1, 2, 3, 1],
  [2, 6, 0, 8],
  [5, 5, 5, 5],
  [4, 3, 4, 3]
];
console.log(getValidPassword(loggedPasscodes)); 
...