如何优化检查对象数组中每个对象的条件是否未定义特定属性?

How to optimise a condition which checks for each object of an array of objects whether specific properties are not undefined?

我想对 if 语句进行代码优化,否则我必须使用 && 将更多键值对添加到此条件中。我有一个对象数组和条件,如以下代码示例所示。

let arr = [{
  a: 12,
  b: 14,
  c: undefined,
  d: undefined,
  e: 56,
  f: "file 1",
  g: "file 2",
  h: undefined,
}];

for (const item of arr) {
  if (
    item.a !== undefined &&
    item.b !== undefined &&
    item.c !== undefined &&
    item.d !== undefined &&
    item.e !== undefined &&
    item.f !== undefined &&
    item.g !== undefined
  ) {
    console.log("code works");
  } else {
    console.log("fails");
  }
}

我正在尝试优化上面的代码,非常感谢任何建议。

您可以使用 Object.values() and some() 编写更短的代码。这不是一个巨大的优化

let arr = [{
    a:12,
    b:14,
    c:undefined,
    d:undefined,
    e:56,
    f:"file 1",
    g:"file 2",
    h:undefined
}]
for(let key of arr){
if(Object.values(key).some((x) => x===undefined)){
console.log("fails")
}else{
console.log("code works")
}
}

创建一个接受对象作为参数的函数,获取它的 values, and then use some 以检查是否有任何值是 undefinedsome returns 找到第一个匹配条件后。

const arr=[{a:12,b:14,c:undefined,d:undefined,e:56,f:'file 1',g:'file 2',h:undefined},{a:12,b:14,c:3,d:'bob from accounting',e:56,f:'file 1',g:'file 2',h:23},{a:12,b:14,c:3,d:'bob from accounting',e:56,f:'file 1',g:'file 2',h:undefined}];

function test(obj) {
  const values = Object.values(obj);
  return values.some(p => p === undefined);
}

const out = arr.map((obj, i) => {
  return `Code ${test(arr[i]) ? 'fails' : 'works'}`;
});

console.log(out);

如果我理解正确的话,你在一个对象中有动态属性,你想检查一个对象中的所有属性是否都有值。如果是,

试试这个 :

let arr = [{
    a:12,
    b:14,
    c:undefined,
    d:undefined,
    e:56,
    f:"file 1",
    g:"file 2",
    h:undefined
}];

arr.forEach(obj => {
  let str = '';
    Object.keys(obj).forEach(key => {
    str = obj[key] ? 'code works' : 'fails'
  })
  console.log(str);
});

我对问题的理解是,OP 不想检查每个对象的值是否不是 undefined 值,而 OP 更想检查是否有一些预定义的属性(例如通过键列表)需要存在并且不等于 undefined.

在这种情况下,可以实现一个函数,通过 属性 名称列表(键列表)检查每个通过的 item/object 这样的对象是否满足上述要求。

这样的函数可以作为回调函数传递给 every 以检测数组的 item/object 是否满足要求。

function isEveryPropertyFromBoundListDefined(item) {
  const keyList = this; // the bound list of defined keys.

  return keyList
    .every(key => item[key] !== undefined);
}

const sampleData_1 = [{
  a: 12, b: 14, c: undefined, d: undefined,
  e: 56, f: "file 1", g: "file 2", h: undefined,
}];
const sampleData_2 = [{
  e: 56, f: "file 1", g: "file 2", h: null,
}, {
  h: 1, g: 2, f: 3, e: 4,
}];
const listOfToBeDefinedKeys = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];

console.log(
  sampleData_1
    // make use of `every`'s 2nd `thisArg` parameter.
    .every(isEveryPropertyFromBoundListDefined, listOfToBeDefinedKeys)
);
console.log(
  sampleData_2
    // make use of `every`'s 2nd `thisArg` parameter.
    .every(isEveryPropertyFromBoundListDefined, ['e', 'f', 'g', 'h'])
);
.as-console-wrapper { min-height: 100%!important; top: 0; }