Javascript 如何验证具有重复ID的对象数组中的值?

Javascript 如何验证具有重复ID的对象数组中的值?,javascript,node.js,arrays,object,Javascript,Node.js,Arrays,Object,我有一个如下所示的对象数组: [ { "id":1, "type":"Greater than", "value":"5" }, { "id":1, "type":"Less than", "value&quo

我有一个如下所示的对象数组:

[
    {
        "id":1,
        "type":"Greater than",
        "value":"5"
    },
    {
        "id":1,
        "type":"Less than",
        "value":"29"
    },
    {
        "id":2,
        "type":"Less than",
        "value":"40"
    },
    {
        "id":3,
        "type":"Greater than",
        "value":"50"
    },
    {
        "id":3,
        "type":"Less than",
        "value":"10"
    },
    {
        "id":4,
        "type":"name",
        "value":"Anna"
    }
]
如果每个ID的所有大于/小于值都正确,我想进行一些验证并返回true

例如,上面的值应该返回false,因为ID 3的大于值大于小于值(即使ID 1是正确的)

并非所有ID的值都大于或小于(请参见ID 2和ID 4)

我一直在尝试不同的方法,但似乎找不到解决办法。

const isValidRange=([start,end])=>
开始
const-id=[
{
“id”:1,
“类型”:“大于”,
“值”:“5”
},
{
“id”:1,
“类型”:“小于”,
“值”:“29”
},
{
“id”:2,
“类型”:“小于”,
“值”:“40”
},
{
“id”:3,
“类型”:“大于”,
“值”:“50”
},
{
“id”:3,
“类型”:“小于”,
“值”:“10”
},
{
“id”:4,
“类型”:“名称”,
“价值”:“安娜”
}
]
函数检查(数组){
const min=new Map()//大于[1->5,3->50]
const max=new Map()//小于[1->29,3->10]
for(数组的let{id,type,value}){
开关(类型){
“小于”的情况:
//>或>=
if(min.has(id)&&min.get(id)>+值){
返回错误
}
最大设置(id,+值)
打破
大小写“大于”:
if(max.has(id)&&max.get(id)<+值){
返回错误
}
最小设置(id,+值)
打破
}
}
返回真值
}
console.log(
支票(ID)

)
数组方法
each()
在这里很方便

在下面的示例中,我还添加了对“等于”属性的支持,并检查单个数组中包含的所有对象,确保它们都有效,忽略任何字符串类型,如
type:“name”,value:“Anna”

请查看:

const data1=[
{id:1,类型:“大于”,值:“5”},
{id:1,类型:“小于”,值:“29”},
{id:2,类型:“小于”,值:“40”},
];
常数数据2=[
{id:3,类型:“大于”,值:“1”},
{id:3,类型:“等于”,值:“3”},
{id:4,键入:“name”,值:“Anna”}
];
const validate=data=>data.each({id:a,value:b,type:t})=>![“大于”,“小于”,“等于”]。包括(t)| |((b=+b),((t==“大于”&(a>b))| |(t==“小于”&(a日志(验证(数据2))嗨!请参阅和,因为“我一直在尝试不同的方法,但似乎找不到解决方案”,您可以向我们展示您所尝试的方法,以便我们提供帮助。我尝试使用Array.find,但问题是获取所有匹配的ID,然后检查其范围值。并非所有ID都有一对@wyck这会让一些人感到不安,因为
ID
通常是一个唯一的字段。如果它是其他东西的id,比如一个相关字段的id,那么可以称它为
key
或其他东西,所以我们知道它不应该是唯一的。即使如此,这也是一个多重映射(每个键都可以有多个值)。您有三个问题:1)在数组中找到适用的对象(使用array.filter),2)测试是否所有过滤条件都适用(在过滤结果上使用array.each),以及3)使对象具有属性
“type”:“大于”,“值”:“5”
指的是执行检查
(输入)=>input>5
并将其应用于输入的函数。那么这三个函数中哪一个是您的实际问题呢?
{“id”:4,“type”:“name”,“value”:“Anna”}
应该被验证吗?@user14374853我已经更新了我的解决方案,使用对象的解构和重命名,使逻辑总体上更简单。我们不需要计算
x.id>+x.value
我们只需计算
a>b
。你从来没有真正根据对象本身来检查对象。我也不是真正的su这就是为什么你要将ID与值进行比较。@VLAZ是的,从这个问题来看,我相信这正是被问到的问题。在大多数情况下,每个对象都会被评估,以查看其
ID
是否大于或小于
值。请再看看这个问题,如果我误解了问题,请告诉我是的,但其他答案似乎也在这样做。不,不是。ID只是将规则链接在一起。OP清楚地说“上面应该返回false,因为ID 3的大于值大于小于值(即使ID 1是正确的)“因此,ID 3是个问题,因为边界冲突。它直接说明ID 1是正确的。我看不出
{“id”:1,“type”:“大于”,“value”:“5”}
如何支持您的逻辑-
1
显然不大于
5
@VLAZ correct,这就是
data1
返回false的原因。这篇文章是关于验证的
false
在这里是一个完全可以接受的返回值。