2017-03-22 20 views
2

我有一個大對象,並且對象中的每個元素都不具有相同的鍵或鍵數。第一個元素具有所有的鍵,並且這個第一個元素的是我想實際使用的每個元素的鍵,填充元素沒有此鍵的空白。Javascript根據另一個對象的鍵和值寫入新對象

我可以將我的大腦包裹在需要發生的事情上,但我無法弄清楚如何對它進行編碼。這是樣品我導入:

[ 
    { 
     "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」。因此,使用的第一個元素的鍵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[]對象....

+2

首先,[不要對數組使用'for..in'循環](http://stackoverflow.com/q/500504/215552)。 –

+1

@MikeMcCaughan他不是。 'user_file [0]'是一個對象,而不是一個數組。 – Barmar

+0

@Barmar D'oh!你顯然是正確的。仍然不應該這樣做。如果你在未來受到誘惑; - )* *悄悄溜走*。 –

回答

1

你可以遍歷只有件F rom索引1以上,並將索引爲零的對象作爲對象的藍色打印。

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

+0

這太漂亮了......我之前沒有用'.map' - 要學習它是如何工作的,但除此之外,這是非常有意義的。我也喜歡三元的表情......好又幹淨!謝謝! –

+0

你能解釋一下爲什麼用','而不是'''結束你的表達式嗎?我不知道這兩者之間有什麼區別..我總是用分號'console.log(「hi」);' –

+0

「結束表達式的意思嗎?帶'var'關鍵字的變量通常用逗號分隔。 –

1

可以通過結合使用如forEachmap Array方法與Object.keys簡化這個過程。

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 : '' 
 
}

1

這裏是能完成這一操作的一種方式一步一步擊穿。這確實不需要任何三元或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);

1

有可能是這樣做的更有效的方式,但是這是我的東西扔在一起,將工作。

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

2

你真的很近。

在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的最酷功能之一:truthiness。當一個對象沒有屬性並且你嘗試訪問它時,它會返回一個虛假值(nullundefined,我記不起頭頂)。

那麼你如何運用真實性?那麼你可以把它看作一個布爾(有點兒),實際上使用||操作。這是一種稱爲合併的技術。

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

爲了把這一行,如果user_file[i][letter]不存在使用"",而不是簡單的術語。

真棒,這是一個很酷的線,但接下來呢?那麼現在我們只需要把所有東西放在一起。

如果你把你的第一個循環的循環,通過對象數組的剩餘部分進行迭代,我們可以做到這一切的權利有:

​​3210

有你有它,從值對象數組對象晚於第一個元素,使用第一個元素的值作爲關鍵字,即使後面的元素沒有與這些關鍵字相對應的值。

+1

非常感謝這個解釋!這真的很有幫助! –

+0

@BrianPowell沒問題,很高興幫助! –

相關問題