Как найти уникальные записи из двух разных массивов в jquery или javascript? - PullRequest
6 голосов
/ 06 мая 2011

Я хочу получить уникальные значения из двух разных массивов.

Два массива, как показано ниже в JavaScript:

<script>
var a=new Array;
var b=new Array;
a={'a','b','c','d','e'}
b={'a','d','e','c'} 
</script>

Я хочу вывод как:

new array => {'a','c','d','e'}

Как найти уникальные записи в обоих массивах, используя функцию-прототип JavaScript или функцию jQuery?

Ответы [ 5 ]

8 голосов
/ 06 мая 2011

Я не знаю, если у вас есть правильные условия. Уникальные значения для меня будут членами, которые появляются только один раз в любом массиве.Кажется, вам нужны члены, которые присутствуют в обоих массивах (общие значения или пересечение ), в зависимости от вашего примера.

Вы можете использовать jQuery для этого.grep() ваш друг.

Вы можете сделать это без jQuery, но я не уверен, что нативные методы filter() и indexOf() имеют лучшую поддержку браузера.

var a = ['a', 'b', 'c', 'd', 'e'],
    b = ['a', 'd', 'e', 'c'];

var common = $.grep(a, function(element) {
    return $.inArray(element, b) !== -1;
});

console.log(common); // ["a", "c", "d", "e"]

С подчеркиванием легко набрать _.intersection(arr1, arr2).

jsFiddle .

2 голосов
/ 06 мая 2011

Я думаю, вы действительно хотели написать:

<script type="text/javascript">
var a = ['a','b','c','d','e'];
var b = ['a','d','e','c']; 
</script>

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

// Compares a to b. Returns all the elements in a that are not in b
// If c provided, add unique elements to c
function getUnique(a, b, c) {
  var c = c || [];
  var ta = a.slice().sort();
  var tb = b.slice().sort();
  var x, y, found = false;
  for (var i=0, iLen=ta.length; i<iLen; i++) {
    x = ta.shift();

    for (var j=0; j<tb.length && !found; j++) { // j.length changes each loop
      if (tb[j] == x) {
        tb.splice(j,1);  // Remove match from b
        found = true;
      }
    }
    if (!found) {
      c.push(x); // If no match found, store in result
    }
    found = false;
  }
  return c;
}
var a = ['a','b','d'];
var b = ['b','e'];

var d = getUnique(a, b);
alert(d);

var c = getUnique(b,a,d);
alert(d);

Но ваш комментарий к первому ответу указывает на то, что вам нужны элементы, общие для обоих массивов, что проще:

function getCommon(a, b) {
  var c = [];
  var ta = a.slice().sort();
  var tb = b.slice().sort();
  var t, found;

  for (var i=0, iLen=ta.length; i<iLen; i++) {
    t = ta[i];
    found = false;

    for (var j=0, jLen=tb.length; j<jLen && !found; j++) {
      if (t == tb[j]) {
        c.push(tb.splice(j,1));
        found = true;
      }
    }
  }
  return c;
}

alert(getCommon(a, b));

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

1 голос
/ 06 мая 2011

Как это:

var a=['a','b','c','d','e']; //Use brackets
var b=['a','d','e','c']

var c = a.concat(b).sort();

var uniques = {};

for(var i=0; i<c.length; i++){
   uniques[c[i]] = true;
}
var uniquesArray = [];
for(var u in uniques)
  uniquesArray.push(u)

Теперь uniqueArray содержит только уникальные значения. Надеюсь, это поможет

1 голос
/ 06 мая 2011

Я бы хотел выполнить эту операцию с помощью поддержки ассоциативных массивов в JavaScript.

<script>
var a=new Array;
var b=new Array;
a={'a','b','c','d','e'}
b={'a','d','e','c'} 

var uniqueArray = new Array;
var tempArray = new Array;

var j = 0;
for(var i = 0; i < a.length; i++) {
    if(!tempArray[a[i]]) {
        tempArray[a[i]] = true;
        uniqueArray[j++] = a[i];
    }
}

for(i = 0; i < b.length; i++) {
    if(!tempArray[b[i]]) {
        tempArray[b[i]] = true;
        uniqueArray[j++] = b[i];
    }
}

</script>
1 голос
/ 06 мая 2011

Найти оригинальный ответ: Разница в массиве JavaScript

В этом случае вы можете использовать Set .Он оптимизирован для операций такого типа (объединение, пересечение, разность).

Убедитесь, что он применим к вашему случаю, если он не допускает дублирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...