2015-01-27 3 views
0

У меня есть массив объектовсделать тот же самый тип всех элементов в массиве объекта

var arr = 
[ 
    {"shares":50,"comments":10}, 
    {"likes":40,"shares":30}, 
    {"comments":10} 
]; 

Я хочу, чтобы преобразовать его в

var arr = 
[ 
    {"shares":50,"comments":10,"likes":0}, 
    {"likes":40,"shares":30,"comments":0}, 
    {"comments":10,"likes":0,"shares":0} 
] 

Свойства не фиксированные номера и имена будут отличаться Посмотреть Еще один пример

var arr2 = [{"a":1},{"b":2},{"c":3},{"d":4},{"e":5},{"f":6}] 

к

var arr2 = [{"a":1,"b":0,"c":0,"d":0,"e":0,"f":0},{"a":0,"b":1,"c":0,"d":0,"e":0,"f":0},{"a":0,"b":0,"c":1,"d":0,"e":0,"f":0},{"a":0,"b":0,"c":0,"d":1,"e":0,"f":0},{"a":0,"b":0,"c":0,"d":0,"e":1,"f":0},{"a":0,"b":0,"c":0,"d":0,"e":0,"f":1}] 

Я могу сделать путем итерации всех элементов массива и ключей каждого элемента, но я не знаю, что это лучший способ?

Есть ли встроенная функция в JavaScript или jQuery?

+0

Он хочет, чтобы добавить акции, комментарии и как ключи, если не существует. – vaso123

+1

@dystroy, я думаю, что это больше похоже на добавление недостающего ключа и установление значения в 0. – Andy

+0

Предполагается, что это должно работать только для 'shares',' comments' и 'likes' или для любого поля, чтобы все объекты имеют те же поля? –

ответ

1

Похоже, что вы хотите

var set = {}; // it will be cleaner with ES6 Set 
$.each(arr, function(_,e){ 
    for (var k in e) set[k] = 1; 
}); 
$.each(set, function(k){ 
    $.each(arr, function(_,e){ 
     if (e[k]===undefined) e[k] = 0; 
    }); 
}); 

Demonstration

+0

Свойства не фиксированы, имя и номер будут разными. –

+0

то в чем же логика?уточните свой вопрос – vaso123

+0

@GovindKamalaPrakashMalviya См. обновленный код для нефиксированных свойств –

0

Просто добавьте ключ со значением, если он не существует:

$(function() { 
    var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}]; 
    $.each(arr, function(idx, obj) { 
     if (typeof obj.shares === 'undefined') { 
      obj.shares = 0; 
     } 
     if (typeof obj.comments === 'undefined') { 
      obj.comments = 0; 
     } 
     if (typeof obj.likes === 'undefined') { 
      obj.likes = 0; 
     } 
     arr[idx] = obj; 
    }); 
    console.log(arr); 


}); 
6

Вы можете использовать http://api.jquery.com/jquery.extend/

var defaults = { "shares" : 0, "comments" : 0, "likes" : 0 }; 

arr = $.map(arr, function(item){ 
    return $.extend({}, defaults, item); 
}); 

http://jsfiddle.net/L74q3ksw/

Edit Re: обновленный вопрос

Теперь это вопрос строительства defaults объекта, который, как я понимаю, есть все уникальные ключи от всех элементов в массиве.

Таким образом, учитывая

var arr2 = [{"a":1},{"b":2},{"c":3},{"d":4},{"e":5},{"f":6}] 

вам нужно извлечь "а", "б", "C", "D" ... и т.д., и создать defaults.

var defaults = {}; 
// collect all the keys and set them with value = 0 in defaults 
arr2.forEach(function(item){ 
    Object.keys(item).forEach(function(key){ 
     defaults[ key ] = 0; 
    }); 
}); 

// same as the previous solution 
arr2 = $.map(arr2, function(item){ 
     return $.extend({}, defaults, item); 
    }); 

http://jsfiddle.net/7dtfzg2f/2/

+0

Почему это поддерживается? Он не отвечает на вопрос ... –

+0

Почему бы и нет ???????? –

+0

@PraveenPrasannan * «Свойства не являются фиксированными числами, а имена будут разными, см. Другой пример» * –

0

С чистого JavaScript:

var defaults = { "shares": 0, "comments": 0, "likes": 0 }; 
var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}]; 

arr.slice().map(function(e) { 
    for (var key in defaults) { 
    e[key] = e[key] || defaults[key]; 
    } 
    return e; 
}); 

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

var defaults = { "shares": 0, "comments": 0, "likes": 0 }; 
var arr = [{"shares":50,"comments":10},{"likes":40,"shares":30},{"comments":10}]; 

arr.forEach(function(e) { 
    for (var key in defaults) { 
    e[key] = e[key] || defaults[key]; 
    } 
}); 

Вы можете получить значения по умолчанию из массива со следующим фрагментом:

var defaults = arr.reduce(function(m,v) { 
for (var key in v) { 
    m[key] = 0; 
} 
return m; 
}, {}); 
Смежные вопросы