Алгоритм JavaScript для нахождения элементов в массиве, которые не находятся в другом массиве

Я ищу хороший алгоритм для получения всех элементов в одном массиве, которые не являются элементами в другом массиве. Так, учитывая эти массивы:

var x = ["a","b","c","t"];
var ​​​​​​​​​y = [​​​​​​​"d","a","t","e","g"];

Я хочу закончить с этим массивом:

var z = ["d","e","g"];

Я использую jQuery, таким образом, я могу использовать в своих интересах $.each() и $.inArray(). Вот решение, которое я предложил, но кажется, что должен быть лучший путь.

// goal is to get rid of values in y if they exist in x
var x = ["a","b","c","t"];
var y = ["d","a","t","e","g"];

var z = [];
$.each(y, function(idx, value){
  if ($.inArray(value,x) == -1) {
    z.push(value);
  }
});
​alert(z);  // should be ["d","e","g"]

Вот код в действии. Какие-либо идеи?

29
задан Tauren 3 June 2010 в 04:14
поделиться

3 ответа

var z = $.grep(y, function(el){return $.inArray(el, x) == -1}); 

Кроме того, имя этого метода слишком короткое, что не может не радовать. Я ожидал, что это будет означать isElementInArray, а не indexOf.

Для демонстрации с объектами см. http://jsfiddle.net/xBDz3/6/

12
ответ дан 28 November 2019 в 00:40
поделиться

Может быть, jLinq может вам помочь?

Он позволяет запускать подобные запросы к объектам javascript.

Например:

var users = [ { name: "jacob", age: 25 },  { name: "bob" , age: 30 }]
var additionalusers = [ { name: "jacob", age: 25 },  { name: "bill" , age: 25 }]

var newusers = jLinq.from(users).except(additionalusers).select();

>>> newusers = [ { name: "bob" , age: 30 } ]

На данный момент это немного излишне для вас, но это надежное решение, о котором я был рад узнать.

Он может выполнять пересечения, объединения, обрабатывать логическую логику и все виды отличного стиля linq.

2
ответ дан 28 November 2019 в 00:40
поделиться

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

// assume x and y are sorted
xi = 0; yi = 0; xc = x.length; yc = y.length;
while ( xi < xc && yi < yc ) {
  if ( x[xi] == y[yi] ) {
    xi += 1;
    yi += 1;
  } else if ( x[xi] < y[yi] ) {
    z.push( x[xi] );
    xi += 1;
  } else {
    z.push( y[yi] );
    yi += 1;
  }
}
// add remainder of x and y to z.  one or both will be empty.
2
ответ дан 28 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: