如何优化检查对象数组中每个对象的条件是否未定义特定属性?
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
以检查是否有任何值是 undefined
。 some
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; }
我想对 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
以检查是否有任何值是 undefined
。 some
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; }