Массив уникальных значений

Имея дело с JSON, возвращенным из YQL, я обнаружил, что ищу способ извлечь все уникальные значения из массива.

function uniqueArrayValues(o){
      var items = o.query.results.row,
          output = [];

  function check(val){
    for(var c=0; c<output.length; c++){
      if(output[c] === val){
        return false;
        }
    }
     return true;
  }

 for(var i=1; i<items.length; i++){
   if(check(items[i].team)){
     output.push(items[i].team);
    }    
  }

  return output;
}

Код выглядит слишком «занятым», и мне было интересно, есть ли более элегантный способ извлечения уникальных значений из массива.


person Q_Mlilo    schedule 22.07.2010    source источник
comment
Вы можете отфильтровать уникальные значения в запросе YQL, если это вам подходит. См. developer.yahoo.com/yql/guide/sorting.html -- - что-то вроде | unique(field="row.team") (поле может быть другим, в зависимости от структуры результата).   -  person salathe    schedule 22.07.2010
comment
Это сработало бы, если бы мне нужны были только уникальные значения, но я извлекаю эти значения из объекта, который уже находится на стороне клиента (я делаю только один запрос YQL).   -  person Q_Mlilo    schedule 22.07.2010
comment
@Q, достаточно честно. Ответ eskimoblood должен вам помочь.   -  person salathe    schedule 22.07.2010


Ответы (2)


Вы можете использовать indexOf, чтобы проверить, находится ли элемент в массиве.

 function check(val){
        return output.indexOf(val) != -1;
    }

или используйте объект вместо массива, если у вас есть уникальный идентификатор или имя: var output = {}

for(var i=1; i<items.length; i++){
   if(!output[items[i].team.id])){
     output [items[i].team.id] = items[i].team;
    }    
  }
person Andreas Köberle    schedule 22.07.2010

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

РЕДАКТИРОВАТЬ: некоторый псевдокод

sort array
last = unused
for each v in array do
  if v != last
     uniqueArray.push_back(v)
     last = v
  end if
end for
// uniqueArray now contains the unique elements of array
person Peter G.    schedule 22.07.2010