[英]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最酷的功能之一: 真實性 。 當一個對象沒有屬性而您嘗試訪問它時,它將返回一個偽造的值( null
或undefined
,我不記得了)。
那么,您如何應用真實性呢? 好吧,您可以將其當作布爾值(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.