2015-10-09 4 views
1

Я пытаюсь написать функцию, которая будет принимать в следующем массиве,Возвращайтесь каждый уникальный экземпляр значения в массиве, в новом массиве

var data = [ 
      { 
       name: 'Josh', 
       description: 'some data about this guy', 
       sortOrder: 'Gold' 
      }, 
      { 
       name: 'Bill', 
       description: 'some data about this guy', 
       sortOrder: 'Platinum' 
      }, 
      { 
       name: 'Gary', 
       description: 'some data about this guy', 
       sortOrder: 'Platinum' 
      }, 
      { 
       name: 'Phillip', 
       description: 'some data about this guy', 
       sortOrder: 'Platinum' 
      }, 
      { 
       name: 'Bob', 
       description: 'some data about this guy', 
       sortOrder: 'Gold' 
      }, 
      { 
       name: 'Barry', 
       description: 'some data about this guy', 
       sortOrder: 'Gold' 
      }, 
      { 
       name: 'Joe', 
       description: 'some data about this guy', 
       sortOrder: 'Gold' 
      }, 
      { 
       name: 'Ed', 
       description: 'some data about this guy', 
       sortOrder: 'Silver' 
      }, 
      { 
       name: 'Baxter', 
       description: 'some data about this guy', 
       sortOrder: 'Platinum' 
      }, 
      { 
       name: 'Patrick', 
       description: 'some data about this guy', 
       sortOrder: 'Silver' 
      }, 
      { 
       name: 'Stepehn', 
       description: 'some data about this guy', 
       sortOrder: 'Silver' 
      } 
]; 

и дать мне массив, который выглядит следующим образом:

[Platinum, Gold, Silver] <-- The order doesn't matter 

Так было бы проверить все sortOrder значения в массиве и возвращает массив, содержащий один экземпляр каждого уникального sortOrder.

Все, что я написал до сих пор, дает мне несколько экземпляров каждого sortOrder .... Может ли кто-нибудь дать мне руку?

У меня есть доступ к библиотеке underscore.js, если это может быть любой помощью.

+0

http://underscorejs.org/#uniq? -> '_.uniq (_. pluck (data, 'sortOrder'))' –

ответ

2

Попробуйте

var result = _.chain(data) 
 
    .pluck('sortOrder') 
 
    .uniq() 
 
    .value(); 
 

 
console.log(result);

Example

3

Это должно работать большие (чистый JS):

var orders = []; 

for (var i = 0; i < data.length; i++){ 

    if (data[i].sortOrder && orders.indexOf(data[i].sortOrder) == -1){ 
     orders.push(data[i].sortOrder); 
    } 

} 
+0

Что мешает нескольким добавлениям того же значения здесь? Повторение 'if ('foo' &&! Orders ['foo']) { orders.push ('foo'); } 'продолжает добавлять в' orders' –

+0

@PaulS. это не должно. Можете ли вы привести мне пример? –

+0

@ YavorIvanov-'orders [data [i] .sortOrder] 'проверяет * заказы * на свойства ** с именем ** * Gold *, * Platinum * и т. Д., Но они являются значениями внутри массива, а не именами свойств. Это просто создает массив всех значений * sortOrder *, включая дубликаты. Возможно, вы пропустили часть «* ... вернуть массив, содержащий один экземпляр каждого уникального sortOrder. *». – RobG

2

С подчеркиванием:

console.log(_.chain(data).pluck('sortOrder').uniq().value()); 
1

Поскольку значения Строка мы можем идти через объект в ваниль JavaScript

var a = (function (arr) { 
    var i, o = {}; 

    for (i = 0; i < arr.length; ++i) 
     o[arr[i].sortOrder] = true; 

    return Object.keys(o); 
}(data)); 
1

без использования каких-либо других библиотек:

var results = []; 
for(var i = 0; i < data.length; ++i){ 
    if(results.indexOf(data[i].sortOrder) < 0){ 
     results.push(data[i].sortOrder); 
    } 
} 

Переменная results будет содержащий список, который вы хотите.

+0

Вам не нужен специальный случай для '.length === 0', _indexOf_ будет давать' -1' еще –

+1

True. Не уверен, что я думал, когда написал первую часть. Отредактировано, чтобы снять это. –

0

Множество простых предложений JS, которые всегда хороши для сравнения с библиотеками. Рассмотрите возможность использования сокращения ES5:

var result = data.reduce(function(acc, val) { 
    if (acc.indexOf(val.sortOrder) == -1) acc.push(val.sortOrder); 
    return acc; 
},[]); 
Смежные вопросы