如何填写对象数组中的缺失键?

时间:2017-12-18 14:47:40

标签: javascript

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

我正在寻找一种简单的方法(原生或通过图书馆),我现在使用的代码现在可以工作,对我未经训练的眼睛看起来很沉重,我确信我重新尝试了一些繁琐的方法来做某事有一个简单的。

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)

3 个答案:

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

相关问题