#javascript
#javascript
Вопрос:
У меня есть 2 массива, как показано ниже
var array1=["m","m","r","r"];
var array2=["r","r","m","r"];
и я хочу сравнить оба массива.
Если первый элемент array1
(который есть "m"
) присутствует в array2
, то удалите оба элемента из обоих массивов. затем массивы должны стать такими, как показано ниже
array1=["m","r","r"];
array2=["r","r","r"];
Снова требуется проверить, присутствует ли первый элемент из обновленного array1
(который есть "m"
) в обновленном array2
, затем удалить оба элемента из обоих массивов. Однако, если первый элемент из обновленного array1
отсутствует в обновленном array2
, то разорвите инструкцию.
Комментарии:
1. Не могли бы вы, пожалуйста, поделиться тем, что вы пробовали для достижения этого?
2. я попробовал ниже var Array1=[«m», «m», «r», «r»]; var Array2=[«r», «r», «r»,»r»]; for(x=0;x<=Array1.len&th;x ){ for(y=0;y<=Array2.len&th;y ){ if(Array1.includes(Array2[y])){ Array1.splice(y,1); Array2.splice(y,1); } else{ break; } } } Но если первый элемент из обновленного array1 отсутствует в обновленном array2, то разорвите инструкцию. он не должен сравнивать другие элементы. это условие не выполняется в моей программе
Ответ №1:
Здесь используется рекурсивный подход для предотвращения потенциальных проблем, вызванных изменением массива во время одновременной итерации.
var arr1 = ["m", "m", "r", "r"];
var arr2 = ["r", "r", "m", "r"];
function cancel(arr1, arr2) {
var next = arr2.indexOf(arr1[0]);
if (next 1) {
arr1.shift();
arr2.splice(next, 1);
if (arr1.len&th)
cancel(arr1, arr2); // recursive call
}
}
cancel(arr1, arr2);
console.lo&(arr1, arr2);
Публикую это, потому что с другими решениями, опубликованными здесь, я обнаружил проблемы в этих сценариях:
Случай 2
var arr1=["m","m","a","r"];
var arr2=["r","r","m","m"];
Должно привести к:
arr1=["a","r"];
arr2=["r","r"];
Пример 3
var arr1=["m","m","r","r"];
var arr2=["r","r","m","m"];
Должно привести к:
arr1=[];
arr2=[];
Ответ №2:
Существует несколько способов добиться этого, вы могли бы либо выполнить два цикла, либо использовать более эффективное решение с большей временной сложностью, используя хэш-карту. Вот простое решение, которое также более эффективно, чем повторение цикла дважды:
array1=["m","r","r"];
array2=["r","r","r"];
const arrMap = {};
// Create hashmap with index
array2.forEach((item, index) =&&t; arrMap[item] = index);
// Search in first array
array1.forEach((item, index) =&&t; {
if (item in arrMap) {
// If item is present, remove it from both arrays;
array1.splice(index, 1)
array2.splice(arrMap[item], 1);
}
})
Ответ №3:
var arr1=["m","m","r","r"];
var arr2=["r","r","m","r"];
while(arr2.some(i =&&t; i === arr1[0])) {
arr2 = arr2.filter(i =&&t; i !== arr1[0]);
arr1.splice(0, 1);
}
console.lo&(arr1, arr2)