簡體   English   中英

使數組對象都具有相同的鍵

[英]Make array objects all have the same keys

我有一個對象數組

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中是否有內置函數?

您可以使用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/

重新編輯:更新的問題

現在,要構建defaults對象,據我所知,該對象具有數組中所有元素的所有唯一鍵。

所以,給定

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

您需要提取“ a”,“ b”,“ 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/

看起來像你想要的

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;
    });
});

示范

只需將鍵和值相加(如果不存在):

$(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);


});

使用純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;
}, {});

以@dusky所說的為基礎,如果您實際上不知道將要輸入哪些列,則可以將列列表作為字符串集。 還假設您只想編輯現有陣列,而不要創建一個新陣列,然后使用ES6。

    // get all keys added to a list that cannot take duplicates
    const columnNames = new Set<string>();
    arr.forEach(element => {
      Object.keys(element)
        .forEach(x => columnNames.add(x));
    });

    // create default with nulls, can replace with 0 or anything here
    const defaultKeys = {};
    columnNames.forEach(x => {
      defaultKeys[x] = null;
    });

    // Add all missing keys into each object
    arr.forEach((element) => {
      for (const key in defaultKeys) {
        element[key] = element[key] || defaultKeys[key];
      }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM