Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Как сверить 2 массива и удалить одинаковые значения?

#javascript #jquery


Предположим  есть ассоциативный массив `

a = {
    "a": "17",
    "b": "1",
    "d": "3",
    "v": "10",
    "e": "4",
    "f": "9"
}


и есть второй массив 

b = {
    "a": "1",
    "b": "3",
    "d": "4",
    "v": "5",
    "e": "6",
    "f": "7"
}


Как мне узнать какие значения есть в ассоциативном массиве a и нет в массиве b ?
или как узнать какие значения есть в массиве b и нет в массиве a . 

То есть например мы сравниваем ассоциативный  массив a c b, и в результате сравнение
мы должны узнать что в ассоциативном массиве a есть значения 17, 10, 9 которых нет
в ассоциативном  массиве b. Или же мы сравниваем b c a , и в результате сравнения мы
должны узнать что в ассоциативном  массиве b есть 5, 6, 7 которых нет в ассоциативном
массиве a. 

нужно узнать уникальные значения значений.

Как делать подобные сравнения ?
    


Ответы

Ответ 1



Мне кажется, ничего сложного. Нужно делать ровно так, как вы описали. Нас интересуют только значения, соответственно отбрасываем ключи: var a_values = Object.keys(a).map(function(key){ return a[key]; }); var b_values = Object.keys(b).map(function(key){ return b[key]; }); После чего ищем "уникальные" для какого-либо массива: var res = []; for (var a_key in a_values) { if (b_values.indexOf(a_values[a_key]) == -1) { res.push(a_values[a_key]); } } Рабочий пример: JSFiddle

Ответ 2



Сначала давайте создадим функцию, которая "поменяет местами" ключи объекта с значениями: function reMap(obj) { var ret={}; for(var k in obj) if(obj.hasOwnProperty(k)) ret[obj[k]]=k; return ret; } После этого мы можем легко преобразовать наши объекты (Да, это именно объекты, а не массивы) к спискам значений, которые собственно и сравним: function getUnique(obj1,obj2) { var ret=[]; for(var k in obj1) { if(obj1.hasOwnProperty(k) && ! obj2.hasOwnProperty(k)) ret.push(k); } return ret; } var a1=reMap(a); var b1=reMap(b); getUnique(a1,b1); getUnique(b1,a1)

Ответ 3



Ответ конечно рабочий, но зачем создавать a_values когда в нем все равно пробегаетесь через for ... in? Нам нужны значения только одного объекта, что бы проводить сравнение. function diff(a, b) { var b_values = [], res = []; for (var key in b) { b_values.push(b[key]); } for (var key in a) { if (b_values.indexOf(a[key]) === -1) { res.push(a[key]); } } return res; }

Комментариев нет:

Отправить комментарий