我有一个对象的输入数组和一个期望的/输出数组
对象的输入数组
var input = [{
"Grade": "AU27",
"Thickness10Qty": "7.00",
"Thickness5Qty": "19.20",
"TotalQty": "26.20"
},
{
"Grade": "FE500D",
"Thickness10Qty": "143.00",
"Thickness12Qty": "69.00",
"Thickness8Qty": "30.00",
"TotalQty": "242.00"
},
{
"Grade": "GE500D",
"Thickness18Qty": "90.00",
"Thickness22Qty": "40.00",
"TotalQty": "130.00"
},
{
"Grade": "HE500D",
"Thickness26Qty": "70.00",
"TotalQty": "70.00"
}
];我将其作为所需的对象数组
var output = [{
"Grade": "AU27",
"Thickness10Qty": "7.00",
"Thickness5Qty": "19.20",
"Thickness12Qty": "0.00",
"Thickness8Qty": "0.00",
"Thickness18Qty": "0.00",
"Thickness22Qty": "0.00",
"Thickness26Qty": "0.00",
"TotalQty": "26.20"
},
{
"Grade": "FE500D",
"Thickness10Qty": "143.00",
"Thickness12Qty": "69.00",
"Thickness8Qty": "30.00",
"Thickness5Qty": "0.00",
"Thickness18Qty": "0.00",
"Thickness22Qty": "0.00",
"Thickness26Qty": "0.00",
"TotalQty": "242.00"
},
{
"Grade": "GE500D",
"Thickness18Qty": "90.00",
"Thickness22Qty": "40.00",
"Thickness10Qty": "0.00",
"Thickness12Qty": "0.00",
"Thickness8Qty": "0.00",
"Thickness5Qty": "0.00",
"Thickness26Qty": "0.00",
"TotalQty": "130.00"
},
{
"Grade": "HE500D",
"Thickness26Qty": "70.00",
"Thickness18Qty": "0.00",
"Thickness22Qty": "0.00",
"Thickness10Qty": "0.00",
"Thickness12Qty": "0.00",
"Thickness8Qty": "0.00",
"Thickness5Qty": "0.00",
"TotalQty": "70.00"
}
];我要做的是假设在object的输入数组中的第一个对象中,只有Thickness10Qty和Thickness5Qty,所以我必须输入其他键作为0。我想在每个对象中有相同数量的键。类似地,对于object的输入数组中的最后一个对象,只存在Thickness26Qty。因此,我们插入其他关键字作为0,以便在每个对象中具有相同数量的关键字。
如何使用相同数量的键来实现所需的对象数组?
密钥不能硬编码,它来自服务,服务可能返回Thickness34Qty/Thickness46Qty而不是Thickness22Qty,或者返回Thickness38Qty而不是Thickness18Qty
发布于 2019-04-18 12:05:17
创建一个对象中应该包含的所有键的数组,然后迭代对象数组,并使用值0.00添加缺少的键
var input = [{
"Grade": "AU27",
"Thickness10Qty": "7.00",
"Thickness5Qty": "19.20",
"TotalQty": "26.20"
},
{
"Grade": "FE500D",
"Thickness10Qty": "143.00",
"Thickness12Qty": "69.00",
"Thickness8Qty": "30.00",
"TotalQty": "242.00"
},
{
"Grade": "GE500D",
"Thickness18Qty": "90.00",
"Thickness22Qty": "40.00",
"TotalQty": "130.00"
},
{
"Grade": "HE500D",
"Thickness26Qty": "70.00",
"TotalQty": "70.00"
}
];
var keys = ["Grade", "TotalQty", "Thickness5Qty", "Thickness8Qty", "Thickness10Qty", "Thickness12Qty", "Thickness18Qty", "Thickness22Qty", "Thickness26Qty"];
var output = input.map(obj => {
keys.forEach(key => obj[key] ? key : obj[key] = "0.00");
return obj;
});
console.log(output);.as-console-wrapper { max-height: 100% !important; top: auto; }
如果键是可变的(例如,您希望每个对象都具有相同的键):
var input = [{
"Grade": "AU27",
"Thickness10Qty": "7.00",
"Thickness5Qty": "19.20",
"TotalQty": "26.20"
},
{
"Grade": "FE500D",
"Thickness10Qty": "143.00",
"Thickness12Qty": "69.00",
"Thickness8Qty": "30.00",
"TotalQty": "242.00"
},
{
"Grade": "GE500D",
"Thickness18Qty": "90.00",
"Thickness22Qty": "40.00",
"TotalQty": "130.00"
},
{
"Grade": "HE500D",
"Thickness26Qty": "70.00",
"TotalQty": "70.00"
}
];
var keys = [...new Set(input.map(Object.keys).reduce((acc, curr) => acc.concat(curr)))];
var output = input.map(obj => {
keys.forEach(key => obj[key] ? key : obj[key] = "0.00");
return obj;
});
console.log(output);.as-console-wrapper { max-height: 100% !important; top: auto; }
发布于 2019-04-18 12:20:15
您可以创建一个模板对象,它的所有键都设置为0.00,它定义了您想要的字段,然后您可以在map()中使用Object.assign()将其与现有对象合并。
var input = [{"Grade": "AU27","Thickness10Qty": "7.00","Thickness5Qty": "19.20","TotalQty": "26.20"},{"Grade": "FE500D","Thickness10Qty": "143.00","Thickness12Qty": "69.00","Thickness8Qty": "30.00","TotalQty": "242.00"}, {"Grade": "GE500D","Thickness18Qty": "90.00","Thickness22Qty": "40.00","TotalQty": "130.00"}, {"Grade": "HE500D","Thickness26Qty": "70.00","TotalQty": "70.00"}];
// make template of all keys
let template = input.reduce((obj, item) => (Object.keys(item).forEach(k => obj[k] = '0.00'), obj), {})
// apply to items:
let newArray = input.map(item => Object.assign({}, template, item))
console.log(newArray)
发布于 2019-04-18 12:32:27
这可能不会设置任何性能记录,但应该演示所发生的步骤以及如何对其进行略微优化。重要的是要注意,对对象的操作将改变输入数组中的对象,因此没有输入/输出数组,因为这将需要克隆对象和比所需更多的工作。
let array = getData()
normalizeData(array)
console.log('output:', array)
function normalizeData(array) {
let stored_keys = {}
array.forEach((obj, ndx, arr) => {
let new_keys = []
// create keys found in other objects
Object.keys(stored_keys).forEach(key => {
if (!(key in obj))
obj[key] = "0.00"
})
// detect new keys
Object.keys(obj).forEach(key => {
if (!stored_keys[key]) {
stored_keys[key] = true // track key
new_keys.push(key) // track new keys to apply to previous objects
}
})
// add any new keys to previous objects
if (new_keys.length)
for (var i = 0, n = ndx; i < n; i++) {
let prev_obj = arr[i];
new_keys.forEach(key => prev_obj[key] = "0.00")
}
})
}
function getData() {
return [{
"Grade": "AU27",
"Thickness10Qty": "7.00",
"Thickness5Qty": "19.20",
"TotalQty": "26.20"
},
{
"Grade": "FE500D",
"Thickness10Qty": "143.00",
"Thickness12Qty": "69.00",
"Thickness8Qty": "30.00",
"TotalQty": "242.00"
},
{
"Grade": "GE500D",
"Thickness18Qty": "90.00",
"Thickness22Qty": "40.00",
"TotalQty": "130.00"
},
{
"Grade": "HE500D",
"Thickness26Qty": "70.00",
"TotalQty": "70.00"
}
];
}
https://stackoverflow.com/questions/55738932
复制相似问题