如何解决如何从可能的属性名称列表中检索在给定对象中不存在的第一个甚至所有属性名称?
我想知道是否有办法从可能的属性名称列表中找出哪些属性名称不存在于对象中。到目前为止我想出的代码看起来像这样......
let invalidBlocks = [];
blocks.map((block,index) => {
if (!block.name || !block.formula || !block.id) {
invalidBlocks.push(index + 1);
}
});
是否有一种优雅的方法可以找到与上述代码中提供的条件相似的第一个甚至所有不存在的属性名称?
解决方法
您可以创建一个包含所有可能键的数组并基于此进行检查。
因此,您可以循环遍历块,然后找到特定块上不存在的键。
const blocks = [{formula: 'exist',id: 'exist'},{name: 'exist',formula: 'exist'},id: 'exist'}]
const invalidBlocks = blocks.map((block) => ['name','formula','id'].find((param) => !block[param]))
console.log(invalidBlocks)
我认为这优雅且易于理解。没有直接检查的内置方法。
,您可以编写一个函数来过滤对象中不存在的属性列表,并重构您的条件语句以检查缺失属性的非空列表:
const findMissingProps = (props,obj) => props.filter(prop => !(prop in obj));
////// usage ////////
const blocks = [
{ name: "name",formula: "f",id: 1,},{ formula: "f",{ name: "name",{ name: "name" },];
let invalidBlocks = [];
blocks.map((block,index) => {
const missingProps = findMissingProps(["name","formula","id"],block);
if (missingProps.length > 0) {
console.error(`Block #${index} missing prop(s): ${missingProps.join(",")}`);
invalidBlocks.push(index + 1);
}
});
您可以尝试这样的操作,但我不确定这是否是您想要实现的目标:
["name","id"].forEach((item,index) => {
if(!block[item]){
invalidBlocks.push(index + 1)
}
})
,
我认为你做不到。对我来说,hack 是使用这样的数组:
let invalidBlocks = []
blocks.map((block,index) => {
const index = [!block.name,!block.formula,!block.id].findIndex(x => x)
if(index != -1) {
invalidBlocks.push(index + 1)
}
})
,
循环属性,将有空值的属性名压入数组。
SRI MP_START MP_END
0 00000031__ 7.14 7.33
1 00000031__ 7.33 7.93
2 00000031__ 7.93 8.02
3 00000031__ 8.02 9.53
4 00000031__ 9.53 10.19
5 00000031__ 10.19 10.37
6 00000031__ 10.37 13.00
7 00000031__ 13.00 13.70
8 00000031__ 13.70 13.97
9 00000031__ 13.97 14.14
10 00000031__ 14.14 14.77
11 00000031__ 14.77 14.96
12 00000031__ 14.96 15.80
13 00000031__ 15.80 16.03
14 00000031__ 16.03 16.36
有两种基于 map
的方法。
第一个为每个 blockList
项目返回所有省略/缺失(自己的)属性名称的列表。
第二种方法稍微改变了第一种方法的实现,以便为每个 blockList
项目返回第一个省略/缺失的(自己的)属性名称。
这两种方法都假定 keyList
它们可以读取,作为 map
方法的 thisArg
提供。因此,任何回调函数都可以在其 this
上下文中运行。
对于这两种方法,每个 map
ping 回调都使用另一个回调,该回调检查 key
(来自提供的密钥列表)是否可以作为当前处理的 {{1} } 项目的 own property。
不同之处在于如何使用同一个回调。第一种方法将其作为 filter
操作,而第二种方法使用 find
再次,对于这两种方法,回调假设当前处理的 blockList
项作为其 blockList
上下文,其中 this
和 {{1} } 两者都提供。
filter
find
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。