我有一个大对象,并且对象中的每个元素都没有相同的键或键数。第一个元素包含所有键,第一个元素的值是我想要实际用作每个元素的键,填充空格,其中元素没有此键
我可以将我的大脑包围在需要发生的事情中,但我无法弄清楚如何编码它。这是导入它的示例:
[
{
"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",而第三个元素缺少键&# 34; G"," H"和"我"。因此,使用FIRST元素的键A through I
作为主模板,我想重写一个 new 对象,如下所示:
[
{
"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[]
对象......
答案 0 :(得分: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。当一个对象没有属性并且您尝试访问它时,它将返回一个假值(null
或undefined
,我无法记住我的顶部头)。
那么你如何应用真实性?好吧,你可以把它当作一个布尔(有点)对待它,并实际上对它使用||
操作。这是一种称为合并的技术。
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 :(得分:1)
您只能迭代索引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; }
答案 2 :(得分:1)
您可以将forEach
和map
等数组方法与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 : ''
}
答案 3 :(得分: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);
答案 4 :(得分: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);
&#13;