Функция должна быть неразрушающей, но она изменяет мою переменную

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть следующий код, который устанавливает special для запуска функцию convertSpecial , которая заменит апостроф в array1 на указанный символ. В данном случае пробел. Поскольку заменяющий символ является пробелом, он разделит этот элемент на два, а затем выровняет массив. Затем она проверит, соответствует ли какой-либо элемент в special любому элементу в array2 . Это вернет false. Затем она заменит апостроф вообще без символа и перепроверит его с array2.

Идея, лежащая в основе convertSpecial и переменной special , заключается в том, что она должна быть неразрушающей для array1 , но этого не происходит, как вы можете видеть:

 var array1 = ["o'hara"];
var array2 = ["ohara"];
var special = '';

function convertSpecial(a,b,c) {
	var aCopy = a;
	for (let i = 0; i < aCopy.length; i  ) {
		if (aCopy[i].includes(b)) {
			if (c == '') {							
				aCopy[i] = aCopy[i].replace(b,c);
			} else {
				aCopy[i] = aCopy[i].replace(b,c).split(' ');
						
				aCopy = aCopy.flat();
			}
		}				
	}
			
	return aCopy;
}
  
console.log('array1 1 = ' array1); // returns array1 1 = o'hara as expected

special = convertSpecial(array1,"'"," ");
				
console.log('array1 2 = ' array1); // returns array1 2 = o,hara THIS SHOULD NOT HAVE BEEN MODIFIED
console.log('special 1 = ' special); //returns special 2 = o,hara as expected

if (array2.some(v => special.includes(v)) == true) {
console.log('array1 3 = ' array1); // ignored as expected

array1 = specialDECln;
} else {
console.log('array1 4 = ' array1); //returns array1 4 = o,hara  THIS SHOULD NOT HAVE BEEN MODIFIED

special = convertSpecial(array1,"'","");
		
console.log('array1 5 = ' array1); //returns array1 5 = o,hara THIS SHOULD NOT HAVE BEEN MODIFIED
console.log('special 2= ' special); //returns special 2 = o,hara should be ohara
					
if (array2.some(v => special.includes(v)) == true) {
	array1 = special;
} 
}
      
console.log(array2 == special);   //returns false, should be true because expected ohara = ohara  

Все работает так, как должно, за исключением того, что array1 изменяется, когда этого вообще не должно быть. Поскольку она модифицируется, special присваивается неверное значение.

Что я делаю не так и как я могу это исправить?

Комментарии:

1. a[i] = a[i].replace(b,c); <— хм, вы ее модифицируете.

Ответ №1:

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

 let result = [...a]; // This creates a new array with the index-values from array a.
  

 var array1 = ["o'hara"];
var special = ''

console.log("array1 = "   array1); // returns array1 = o'hara as expected

function convertSpecial(a, b, c) { // a = array, b = character to replace, c = character to replace with
  let result = [...a];
  for (let i = 0; i < result.length; i  ) {
    if (result[i].includes(b)) {
      if (c == '') {
        result[i] = result[i].replace(b, c);
      } else {
        result[i] = result[i].replace(b, c).split(' ');
        result = result.flat();
      }
    }
  }

  return resu<
}

special = convertSpecial(array1, "'", " ");

console.log("array1 = "   array1); // returns array1 = o, hara but it should be o'hara

console.log("special = "   special); // returns special = o, hara as expected  

Ответ №2:

Сначала вам нужно дублировать массив:

 var array1 = ["o'hara"];
var special = ''

console.log("array1 = "   array1); // returns array1 = o'hara as expected

function convertSpecial(a, b, c) { // a = array, b = character to replace, c = character to replace with
  var aCopy = a.slice();
  for (let i = 0; i < aCopy.length; i  ) {
    if (aCopy[i].includes(b)) {
      if (c == '') {
        aCopy[i] = aCopy[i].replace(b, c);
      } else {
        aCopy[i] = aCopy[i].replace(b, c).split(' ');

        aCopy = aCopy.flat();
      }
    }
  }

  return aCopy;
}

special = convertSpecial(array1, "'", " ");

console.log("array1 = "   array1); // returns array1 = o, hara but it should be o'hara

console.log("special = "   special); // returns special = o, hara as expected  

Комментарии:

1. по какой-то причине это все еще изменяет array1… смотрите обновленный ответ

2. Что вы имеете в виду? arrray1 все еще o'hara .

3. посмотрите на мой вопрос, array1 завершается изменением после запуска функции.

4. Эмм, no…it все еще o'hara — посмотрите на мой ответ.

5. все, что я могу сказать, это то, что когда вы нажимаете run на мой вопрос, это не то, что отображается.