簡體   English   中英

Javascript根據另一個對象的鍵和值編寫新對象

[英]Javascript write new object based on the keys and values of another object

我有一個大對象,並且對象中的每個元素都不具有相同的鍵或鍵數。 第一個元素具有所有鍵,而這個第一個元素的是我實際要用作每個元素的鍵的 ,並在該元素沒有此鍵的地方填充空白。

我可以全神貫注於需要發生的事情,但是我只是不知道如何編寫代碼。 這是導入時的示例:

[
    {
        "A": "Name",
        "B": "Type",
        "C": "Company",
        "D": "Year",
        "E": "Alt1",
        "F": "Name1",
        "G": "Alt2",
        "H": "Name2",
        "I": "Notes"
    },
    {
        "A": "Skittles",
        "C": "Mars",
        "D": 0,
        "E": "Cadbury",
        "F": "Sour Patch Kids",
        "I": "CLEAN"
    },
    {
        "A": "Love",
        "B": "Chocolate",
        "C": "Dove",
        "D": 0,
        "E": "0",
        "F": "0",
    }
]

在此示例中,第二個元素缺少鍵“ B”,“ G”和“ H”,而第三個元素則缺少鍵“ G”,“ H”和“ I”。 因此,使用FIRST元素的鍵A through I作為主模板,我想重寫一個對象,如下所示:

[
    {
        "Name": "Skittles",
        "Type": "",
        "Company": "Mars",
        "Year": 0,
        "Alt1": "Cadbury",
        "Name1": "Sour Patch Kids",
        "Alt2": "",
        "Name2": "",
        "Notes": "CLEAN"
    },
    {
        "Name": "Love",
        "Type" : "Chocolate",
        "Company": "Dove",
        "Year": 0,
        "Alt1": "",
        "Name1": "",
        "Alt2": "",
        "Name2": "",
        "Notes": ""
    }
]

我已經寫了幾個for循環,但是我似乎無法理解它的復雜性……據我所知:

a = [];
b = [];
new_keys = [];

/* Capture the new keys */
for(var v in user_file[0]) {
  if(user_file[0].hasOwnProperty(v)) {
    new_keys.push(user_file[0][v]);
  }
}

/* user_file is the object I pasted above... */
for ( var i = 0 ; i<user_file.length; i++ ) {
    /* write the b object */

    /* then push that object into a */
    a.push(b);

    /* Empty out b */
    b = [];
}

我不知道如何寫這個b[]對象。

你真的很親近

在Javascript中,您實際上可以訪問數組之類的對象。 obj['key1']將返回與obj.key1相同的值。

現在,您有了這些鍵的列表,並且知道了哪個字母, A, B, C, etc.對應於哪個鍵( user_file[0][letter] ),您實際上可以遍歷這些鍵並使用一個臨時對象存儲信息( tmp[user_file[0][letter]] = user_file[i][letter] )。

但是,如果user_file[i][letter]不存在怎么辦? 這是關於javascript最酷的功能之一: 真實性 當一個對象沒有屬性而您嘗試訪問它時,它將返回一個偽造的值( nullundefined ,我不記得了)。

那么,您如何應用真實性呢? 好吧,您可以將其當作布爾值(kinda)對待,並實際上使用|| 操作就可以了。 這是一種稱為合並的技術。

tmp[user_file[0][letter]] = user_file[i][letter] || "";

如果user_file[i][letter]不存在,則用簡單的術語來表示這一行,請改用""

很棒,這很酷,但是接下來呢? 好了,現在我們只需要把所有東西放在一起。

如果將您的第一個循環放在一個遍歷對象數組其余部分的循環中,那么我們可以在此完成所有操作:

for(var i = 1; i < user_file.length; i++) {
    var tmp = {};
    for(var v in user_file[0]) {
      if(user_file[0].hasOwnProperty(v)) {
        tmp[user_file[0][v]] = user_file[i][v] || "";
      }
    }
   a.push(tmp);
}

有了它,就可以使用第一個元素的值作為鍵,使用比第一個元素晚的對象中的值組成的對象數組,即使后面的元素沒有與這些鍵對應的值。

您可以僅迭代索引1和更大的元素,然后將索引0處的對象作為對象的藍圖。

 var data = [{ A: "Name", B: "Type", C: "Company", D: "Year", E: "Alt1", F: "Name1", G: "Alt2", H: "Name2", I: "Notes" }, { A: "Skittles", C: "Mars", D: 0, E: "Cadbury", F: "Sour Patch Kids", I: "CLEAN" }, { A: "Love", B: "Chocolate", C: "Dove", D: 0, E: "0", F: "0", }], keys = Object.keys(data[0]), result = data.slice(1).map(function (o) { var temp = {}; keys.forEach(function (k) { temp[data[0][k]] = k in o ? o[k] : ''; }); return temp; }); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以通過使用諸如forEach Array方法和與Object.keys結合使用map來簡化此過程。

 var array = [ { "A": "Name", "B": "Type", "C": "Company", "D": "Year", "E": "Alt1", "F": "Name1", "G": "Alt2", "H": "Name2", "I": "Notes" }, { "A": "Skittles", "C": "Mars", "D": 0, "E": "Cadbury", "F": "Sour Patch Kids", "I": "CLEAN" }, { "A": "Love", "B": "Chocolate", "C": "Dove", "D": 0, "E": "0", "F": "0", } ] var master = array.shift() master = Object.keys(master).map(function (k) { return [k, this[k]] }, master) array.forEach(function (e) { master.forEach(function (pair) { var value = pair[0] in e ? e[pair[0]] : defaultValueFor(pair[0]) delete e[pair[0]] e[pair[1]] = value }) }) console.log(array) function defaultValueFor (key) { return key === 'Year' ? 0 : '' } 

以下是完成此操作的一種方法的分步說明。 這樣做的好處是不需要任何三元或if塊...

 var user_file = [ { "A": "Name", "B": "Type", "C": "Company", "D": "Year", "E": "Alt1", "F": "Name1", "G": "Alt2", "H": "Name2", "I": "Notes" }, { "A": "Skittles", "C": "Mars", "D": 0, "E": "Cadbury", "F": "Sour Patch Kids", "I": "CLEAN" }, { "A": "Love", "B": "Chocolate", "C": "Dove", "D": 0, "E": "0", "F": "0", } ]; // split off the first set of keys var keys = user_file[0]; // keep the data separate var data = user_file.splice(1); // iterate over the data var result = data.map(function (item) { // item is now one of the last two items // get the keys for that item var itemKeys = Object.keys(item); // Make a blank var newItem = {}; // iterate over the keys itemKeys.forEach(function (key) { // get the "real" key name var realKey = keys[key]; // set the value of that key to the value of the item newItem[realKey] = item[key]; }); // add to result return newItem; }); console.log(result); 

可能有一種更有效的方法來執行此操作,但是我認為這是可行的。

 var data = [{ "A": "Name", "B": "Type", "C": "Company", "D": "Year", "E": "Alt1", "F": "Name1", "G": "Alt2", "H": "Name2", "I": "Notes" }, { "A": "Skittles", "C": "Mars", "D": 0, "E": "Cadbury", "F": "Sour Patch Kids", "I": "CLEAN" }, { "A": "Love", "B": "Chocolate", "C": "Dove", "D": 0, "E": "0", "F": "0", }]; var keyMap = data.shift(); var templateObj = { "A": '', "B": '', "C": '', "D": '', "E": '', "F": '', "G": '', "H": '', "I": '', }; var results = []; data.forEach(function(item) { var tmpResult = Object.assign({}, templateObj, item); var processedItem = {}; for (var prop in tmpResult) { processedItem[keyMap[prop]] = tmpResult[prop]; } results.push(processedItem); }); console.log(results); 

暫無
暫無

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

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