2015-04-09 2 views
0

Мне нужно получить из заданного массива объектов все разные значения для заданного ключа. Пример:javascript получает в массиве все разные значения для ключа в массиве объектов

var arr = [ 
     { 
     "cod": 0 
     "level": "INF" 
     },{ 
     "cod": 1 
     "level": "INF" 
     },{ 
     "cod": 2 
     "level": "INC" 
     },{ 
     "cod": 3 
     "level": "IND" 
     } 
] 

different_values(arr,'level')

должен вернуться:

['INF','INC','IND'] 

Что бы быть простой способ добиться так?

ответ

5

Прокрутите массив и получите указанное свойство от каждого элемента. использовать их как ключи в объекте, чтобы избавиться от дубликатов, а затем вернуть ключи этого объекта.

var arr = [ 
 
     { 
 
     "cod": 0, 
 
     "level": "INF" 
 
     },{ 
 
     "cod": 1, 
 
     "level": "INF" 
 
     },{ 
 
     "cod": 2, 
 
     "level": "INC" 
 
     },{ 
 
     "cod": 3, 
 
     "level": "IND" 
 
     } 
 
]; 
 
function different_values(array, property) { 
 
    var values_seen = {}; // for removing duplicates 
 
    for (var i = 0; i < array.length; i++) { 
 
     values_seen[array[i][property]] = true; 
 
    } 
 
    return Object.keys(values_seen); 
 
} 
 
alert(JSON.stringify(different_values(arr, 'level')));

+0

Да, мне нравится этот метод deduping. – Andy

-1
function different_values(array, key) { 

    var count = array.length, 
     output = []; 

    for (var i = 0; i < count; i++) { 
     output.push(array[i][key]); 
    } 

    return output; 
} 
+0

В чем причина проглатывания? –

+0

Вы не удаляете дубликаты из выходного массива, чего хочет OP. – Andy

+0

К сожалению, слово "different" не указано. –

0

попробовать это:

function different_values(arr,key){ 
    var diff=[]; 
    for(var i = 0;i < arr.length;i++){ 
     var k=arr[i][key]; 
     if(diff.indexOf(k)===-1)diff.push(k); 
    } 
    return diff; 
} 
+2

Вам следует избегать использования циклов 'for in' для массивов. 'for (var i = 0, l = arr.length; i Andy

+0

Почему я должен его избегать? –

+0

http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea – Andy

-1

Просто цикл через объекты в цикле и нажать уровень в результирующем массиве.

Edit: добавил IndexOf получить уникальные значения

function different_values (arr, key) { 
    var result = []; 

    for (var i in arr) { 
     if (result.indexOf(arr[i][key]))    
      result.push(arr[i][key]); 
    } 

    return result; 
} 

Убедитесь, чтобы исправить свои объекты. У вас не хватает запятой между элементами:

{ 
    "cod": 0 
    "level": "INF" 
} 

должно быть:

{ 
    "cod": 0, 
    "level": "INF" 
}