#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; }
Комментариев нет:
Отправить комментарий