
19.09.2014, 22:46
|
Новичок на форуме
|
|
Регистрация: 19.09.2014
Сообщений: 7
|
|
Очистить массив от дубликатов по двум полям
Помогите решить задачу, я что то разобраться никак не могу.
Есть большой массив объектов, в которых расположены два ключа, group и version
Необходимо перебрать массив удалить все дубликаты по двум значениям, т.е. связка group && version
Код:
|
[ { group: 'group-sedan', version: 'iv' },
{ group: 'group-sedan', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' },
{ group: 'group-sedan', version: 'iii' },
{ group: 'group-sedan', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' },
{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-sedan', version: 'ii' },
{ group: 'group-sedan', version: 'ii' },
{ group: 'group-coupe', version: 'i' },
{ group: 'group-coupe', version: 'i' },
{ group: 'group-sedan', version: 'i' },
{ group: 'group-sedan', version: 'i' } ] |
Нужно получить на выходе
Код:
|
[ { group: 'group-sedan', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' },
{ group: 'group-sedan', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' },
{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-sedan', version: 'ii' },
{ group: 'group-coupe', version: 'i' },
{ group: 'group-sedan', version: 'i' } ] |
Пробовал так
var clean = arr.filter(function(obj, i) {
return (obj.version in used && obj.group in used) ? 0 : (used[obj.version] = 1) && (used[obj.group] = 1);
});
console.log(clean);
Но что то не правильно.
|
|

20.09.2014, 00:35
|
Аспирант
|
|
Регистрация: 19.09.2014
Сообщений: 73
|
|
webphp, как-то так
( function () {
'use strict';
var array = [
{
group: 'sedan' ,
version: 'a'
} ,
{
group: 'sedan' ,
version: 'a'
} ,
{
group: 'sedan' ,
version: 'b'
}
];
function getArrayUnique( array ) {
var flags = [] ,
output = [] ,
l = array.length;
for( var i = 0; i < l; i += 1 ) {
if( flags[ array[ i ].group ] && flags[ array[ i ].version ] ) {
continue;
}
flags[ array[ i ].group ] = true;
flags[ array[ i ].version ] = true;
output.push( {
group: array[ i ].group ,
version: array[ i ].version
} );
}
return output;
}
var newArray = getArrayUnique( array );
window.console.log( newArray );
} () );
|
|

20.09.2014, 00:47
|
Новичок на форуме
|
|
Регистрация: 19.09.2014
Сообщений: 7
|
|
Спс, но вот еще вариант
var clean = arr.filter(function(obj, i) {
return (obj.version + ':' + obj.group in used) ? 0 : (used[obj.version + ':' + obj.group]= 1);
});
Еще вопрос, как можно из такого массива
[ { group: 'group-sedan', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' },
{ group: 'group-sedan', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' },
{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-sedan', version: 'ii' },
{ group: 'group-coupe', version: 'i' },
{ group: 'group-sedan', version: 'i' } ]
Получить двумерный массив, распределенный по значению version
[[ { group: 'group-sedan', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' }],
[{ group: 'group-sedan', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' }],
[{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-sedan', version: 'ii' }],
[{ group: 'group-coupe', version: 'i' },
{ group: 'group-sedan', version: 'i' } ]]
|
|

20.09.2014, 00:56
|
Аспирант
|
|
Регистрация: 19.09.2014
Сообщений: 73
|
|
webphp, в данном случае можно или переделать алгоритм выборки уникальных, или смотреть в сторону сортировки, а затем заново писать алгоритм разбивки
|
|

20.09.2014, 01:17
|
Новичок на форуме
|
|
Регистрация: 19.09.2014
Сообщений: 7
|
|
Сообщение от d.skuratovich
|
webphp, в данном случае можно или переделать алгоритм выборки уникальных, или смотреть в сторону сортировки, а затем заново писать алгоритм разбивки
|
Не могли бы показать на пальцах, как это выглядить должно? Я пока себе это не представляю, пробовал по разному, но ничего толкового не вышло =(
Буду очень благодарен.
|
|

20.09.2014, 15:41
|
 |
Кандидат Javascript-наук
|
|
Регистрация: 22.07.2013
Сообщений: 104
|
|
webphp,
function getUnique(data) {
var i = 0, j = 0, l = data.length, res = [];
for ( ; i < l; ++i ) {
for ( j = i; j < l; ++j ) {
if (i != j && data[i].group == data[j].group && data[i].version == data[j].version) {
res.push(data[i]);
continue;
}
}
}
return res;
}
var inputArr = [
{ group: 'group-sedan', version: 'iv' },
{ group: 'group-sedan', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' },
{ group: 'group-wagon_5', version: 'iv' },
{ group: 'group-sedan', version: 'iii' },
{ group: 'group-sedan', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' },
{ group: 'group-wagon_5', version: 'iii' },
{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-wagon_5', version: 'ii' },
{ group: 'group-sedan', version: 'ii' },
{ group: 'group-sedan', version: 'ii' },
{ group: 'group-coupe', version: 'i' },
{ group: 'group-coupe', version: 'i' },
{ group: 'group-sedan', version: 'i' },
{ group: 'group-sedan', version: 'i' }
];
console.log(getUnique(inputArr));
позже сделаю с двумерным массивом
Последний раз редактировалось Arramis, 20.09.2014 в 15:47.
|
|
|
|