#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 на мой вопрос, это не то, что отображается.