2015-04-13 3 views
2

Я заявляю, что я пробовал в течение долгого времени, прежде чем писать этот пост.Удалите элементы из одного массива, если не во втором массиве

Для сценария InDesign я работаю с двумя массивами ListItems. Теперь я пытаюсь удалить элементы одного массива, которые не находятся во втором массиве, но я застрял.

Учитывая, что я использую следующий яваскрипта код (он прекрасно работает), чтобы удалить одинаковые элементы между двумя массивами:

function check_dupli(arr_A, arr_B) { 
    for(var i = arr_B.length - 1; i >= 0; i--) { 
     for(var j = 0; j < arr_A.length; j++) { 
      if(arr_B[i] === arr_A[j]) { 
       arr_B.splice(i, 1); 
      } 
     } 
    } 
    arr_B.sort(); 
} 

arr_A = ["a","b","d","f","g"] 
arr_B = ["a","c","f","h"] 

check_dupli(arr_A, arr_B) --> arr_B = ["c","h"] 
check_dupli(arr_B, arr_A) --> arr_B = ["b","d","g"] 

Я думал, изменить его, чтобы игнорировать элементы не то, что не в как массивы, и получить то, что я хочу, но что-то происходит не так, потому что я также получаю нежелательные данные:

function get_dupli(arr_A, arr_B, arr_C) { 
    for(var e = arr_B.length - 1; e >= 0; e--) { 
     for(var k = 0; k < arr_A.length; k++) { 
      if(arr_B[e] === arr_A[k]) { 
       arr_C.push(arr_B[e]); 
      } 
     } 
    } 
    arr_C.sort(); 
} 

arr_A = ["a","b","d","f","g"] 
arr_B = ["a","g","k"] 
arr_C = ["h"] 

get_dupli(arr_A, arr_B, arr_C) --> arr_C = ["a","g","h","k"] instead of --> ["a","g","h"] 
get_dupli(arr_B, arr_A, arr_C) --> arr_C = ["a","b","d","f","g","h"] instead of --> ["a","g","h"] 

Где я ошибаюсь? Есть ли другой способ в чистом javascript для решения проблемы?

Заранее благодарим за любую помощь.

+0

Если вы просто работаете с двумя массивами, как указано, то зачем вводить третий массив в первую очередь? –

+1

Ваш код работает: [jsfiddle] (http: // jsfiddle.net/oejaxhyj/1 /) –

ответ

0

Opsss .... Я полагал, что я дал ответ и закрыл этот пост ... извините !!!

Несмотря на все проверки, которые я сделал, провал шахты в качестве вашего сценария был вызван глупой ошибкой ... массив arr_A, переданный функции, был модифицированной копией исходного массива.

Благодарим вас за вашу заботу и помощь. Извините еще раз ...

1

Делают это так:

//the array which will loose some items 
 
var ar1 = ["a", "b", "c"]; 
 
//the array which is the template 
 
var ar2 = ["d", "a", "b"]; 
 

 
var tmpar = []; 
 

 
for(var i = 0; i < ar1.length; i++){ 
 
    if(ar2.indexOf(ar1[i]) !== -1){ 
 
    tmpar.push(ar1[i]); 
 
    } 
 
} 
 

 
ar1 = tmpar; 
 

 
alert(ar1);

Мы создаем временный массив для хранения действительных значений.

Мы уверены, что индекс значения из первого массива не равен «-1». Если это «-1», индекс не найден, и поэтому значение недействительно! Мы сохраняем все, что не является «-1» (поэтому мы сохраняем каждое допустимое значение).

1

Вы можете использовать Array.prototype.filter и Array.prototype.concat просто это:

arr_A = ["a","b","d","f","g"] 
 
arr_B = ["a","g","k"] 
 
arr_C = ["h"] 
 

 
function getCommonItems(arrayA, arrayB, result) { 
 
result = result || []; 
 
result = result.concat(arrayA.filter(function(item) { 
 
      return arrayB.indexOf(item) >= 0;  
 
      })); 
 
return result.sort(); 
 
} 
 

 
alert(getCommonItems(arr_A, arr_B, arr_C).join(", ")); 
 
alert(getCommonItems(arr_B, arr_A, arr_C).join(", "));

Для первого сценария:

arr_A = ["a","b","d","f","g"] 
 
arr_B = ["a","c","f","h"] 
 

 
function getDifference(arrayA, arrayB, result) { 
 
return arrayB.filter(function(item) { 
 
      return arrayA.indexOf(item) === -1;  
 
    }).sort(); 
 
} 
 

 
alert(getDifference(arr_A, arr_B).join(", ")); 
 
alert(getDifference(arr_B, arr_A).join(", "));

+0

Amit Joki Я вошел в третий массив, чтобы не менять первые два. Подумайте об этом как о временном массиве. –

+0

John S Точно, на JSfiddle работает правильно, но при попытке использовать InDesign это не так: результат также включает в себя то, что следует игнорировать. –

+0

OddDev Я уже проводил тесты с кодом, как вы предлагаете, но результат такой же, как и предыдущий. –

0

Array.prototype.contains = function (object) 
 
{ 
 
\t var i = 0, n = this.length; 
 
\t 
 
\t for (i = 0 ; i < n ; i++) 
 
\t { 
 
\t \t if (this[i] === object) 
 
\t \t { 
 
\t \t \t return true; 
 
\t \t } 
 
\t } 
 
\t 
 
\t return false; 
 
} 
 

 
Array.prototype.removeItem = function(value, global) { 
 
\t var idx; 
 
\t var n = this.length; 
 
\t while (n--) { 
 
\t \t if (value instanceof RegExp && value.test (this[n]) 
 
\t \t || this[n] === value) { 
 
\t \t \t this.splice (n, 1); 
 
\t \t \t if (!global) return this; 
 
\t \t } 
 
\t } 
 
\t return this; 
 
}; 
 

 
arr_A = ["a","b","d","f","g"]; 
 
arr_B = ["a","c","f","h"]; 
 

 
var item 
 
while (item = arr_A.pop()) { 
 
\t arr_B.contains (item) && arr_B.removeItem (item ); 
 
} 
 

 
arr_B;

+0

Результат вашего кода противоположный тому, что мне нужно: ["c", "h"] вместо ["a", "f"]. –

0

arr_A = ["a","b","d","f","g"]; 
 
arr_B = ["a","c","f","h"]; 
 
var newArr = []; 
 
var item 
 
while (item = arr_B.shift()) { 
 
\t arr_A.contains (item) && newArr[ newArr.length ] = item ; 
 
} 
 
newArr;// ["a", "f"];

+0

Эта версия скрипта работает хорошо, но, как и другие, когда я вставляю ее в свой полный проект, больше не работает. В следующие выходные я проведу полную проверку своего кода, я подозреваю, что у меня что-то не получается, что мешает правильной работе ваших предложений. –

+0

Функция прототипа должна быть помещена перед любыми вызовами. Поместите функции в начале кода и повторите попытку. – Loic