Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.09.2014, 22:46
Новичок на форуме
Отправить личное сообщение для webphp Посмотреть профиль Найти все сообщения от webphp
 
Регистрация: 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);


Но что то не правильно.
Ответить с цитированием
  #2 (permalink)  
Старый 20.09.2014, 00:35
Аспирант
Отправить личное сообщение для d.skuratovich Посмотреть профиль Найти все сообщения от d.skuratovich
 
Регистрация: 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 );
} () );
Ответить с цитированием
  #3 (permalink)  
Старый 20.09.2014, 00:47
Новичок на форуме
Отправить личное сообщение для webphp Посмотреть профиль Найти все сообщения от webphp
 
Регистрация: 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' } ]]
Ответить с цитированием
  #4 (permalink)  
Старый 20.09.2014, 00:56
Аспирант
Отправить личное сообщение для d.skuratovich Посмотреть профиль Найти все сообщения от d.skuratovich
 
Регистрация: 19.09.2014
Сообщений: 73

webphp, в данном случае можно или переделать алгоритм выборки уникальных, или смотреть в сторону сортировки, а затем заново писать алгоритм разбивки
Ответить с цитированием
  #5 (permalink)  
Старый 20.09.2014, 01:17
Новичок на форуме
Отправить личное сообщение для webphp Посмотреть профиль Найти все сообщения от webphp
 
Регистрация: 19.09.2014
Сообщений: 7

Сообщение от d.skuratovich Посмотреть сообщение
webphp, в данном случае можно или переделать алгоритм выборки уникальных, или смотреть в сторону сортировки, а затем заново писать алгоритм разбивки
Не могли бы показать на пальцах, как это выглядить должно? Я пока себе это не представляю, пробовал по разному, но ничего толкового не вышло =(
Буду очень благодарен.
Ответить с цитированием
  #6 (permalink)  
Старый 20.09.2014, 15:41
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистить двумерный массив vah-smile Элементы интерфейса 7 30.03.2011 15:26
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14