我有一个对象数组,它们都应该具有相同的键,但缺少一些键。我想用通用值填充缺失的键。

我正在寻找一种简单的方法来做到这一点(本地或通过库),我现在使用的下面的代码可以工作,在我未经训练的眼睛看起来很沉重,我确信我重新发明了一种乏味的方式来做某事,而有一个简单的一个。

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)

最佳答案

这是一个在对象文字中使用属性传播的版本,尽管这将有非常有限的浏览器支持:

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

关于javascript - 如何填充对象数组中缺少的键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47870887/

10-12 01:35