我有一个对象数组,它们都应该具有相同的键,但是缺少一些键。我想用通用值填写缺失的密钥。
我正在寻找一种简单的方法(原生或通过图书馆),我现在使用的代码现在可以工作,对我未经训练的眼睛看起来很沉重,我确信我重新尝试了一些繁琐的方法来做某事有一个简单的。
var arr = [{
"a": 1,
"b": 2,
"c": 3
},
{
"a": 10,
"c": 30
},
{
"b": 200,
"c": 300
},
]
// get the list of all keys
var allkeys = []
arr.forEach((objInArr) => {
allkeys = allkeys.concat(Object.keys(objInArr))
})
// check all arr entries for missing keys
arr.forEach((objInArr, i) => {
allkeys.forEach((key) => {
if (objInArr[key] === undefined) {
// the generic value, in this case 0
arr[i][key] = 0
}
})
})
console.log(arr)
答案 0 :(得分:1)
您可以使用 Object.assign 将每个元素与包含默认键值的对象合并:
var arr = [{
"a": 1,
"b": 2,
"c": 3
},
{
"a": 10,
"c": 30
},
{
"b": 200,
"c": 300
},
];
var defaultObj = arr.reduce((m, o) => (Object.keys(o).forEach(key => m[key] = 0), m), {});
arr = arr.map(e => Object.assign({}, defaultObj, e));
console.log(arr);

答案 1 :(得分:1)
您的版本没问题,但我可能会通过使用密钥构建对象(或Set
)来避免所有这些数组concat
调用。 for-of
:
var arr = [{
"a": 1,
"b": 2,
"c": 3
},
{
"a": 10,
"c": 30
},
{
"b": 200,
"c": 300
},
];
// Get all the keys
const keyObj = Object.create(null);
for (const entry of arr) {
for (const key of Object.keys(entry)) {
keyObj[key] = true;
}
}
const allkeys = Object.keys(keyObj);
// Check all arr entries for missing keys
for (const entry of arr) {
for (const key of allkeys) {
if (entry[key] === undefined) { // ***I'd change this
entry[key] = 0;
}
}
}
console.log(arr);

.as-console-wrapper {
max-height: 100% !important;
}

重新*** I'd change this
:请注意,存在且具有值undefined
的属性与根本不存在的属性之间存在差异。您的代码将它们视为同一个东西。当然,如果你知道他们没有获得价值undefined
(例如,因为您正在从中获取API)...
答案 2 :(得分:1)
这是一个使用对象文字中的属性扩展的版本,尽管这将具有非常有限的浏览器支持:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
var arr = [{
"a": 1,
"b": 2,
"c": 3
},
{
"a": 10,
"c": 30
},
{
"b": 200,
"c": 300
},
]
// Create an object with all the keys in it
// This will return one object containing all keys the items
let obj = arr.reduce((res, item) => ({...res, ...item}));
// Get those keys as an array
let keys = Object.keys(obj);
// Create an object with all keys set to the default value (0)
let def = keys.reduce((result, key) => {
result[key] = 0
return result;
}, {});
// Use object destrucuring to replace all default values with the ones we have
let result = arr.map((item) => ({...def, ...item}));
// Log result
console.log(result);