JavaScript如何检查一个对象数组中的每个元素是否都包含在另一个数组中?

4
我有两个包含对象的数组。
var requiredfileds=[
    {name:'CVR', value:'cvr_code'},
    {name:'NODE POINT VAL', value:'node_point_val'},

 ]

第二个数组
var results = [
    {name:'CVB', data:[12,11,233,445]}
    {name:'CVR', data:[125,1,-45,4]}
   ]

现在我想检查以确保必填字段数组中的所有名称都在结果数组中。因此,从上述两个示例中,我希望结果为false,并且所需字段缺失为{name:'NODE POINT VAL', value:'node_point_val'},

所以我已经尝试过(使用es6)

this.is_valid = true;   
this.requiredfields.forEach(field=>{
  this.results.forEach(item=>{
    this.is_valid = item.name === field.name;
  })
})

但是上述方法不起作用,我该怎么办?

尝试使用.every() - Barmar
@Barmar .every 函数会在所有值都通过测试时返回 true,我认为这不会给予提问者他们所需要的。 - zfrisch
没有看到他还想要缺失名称的列表,而不仅仅是一个真/假结果。 - Barmar
5个回答

4
尝试这个:通过应用回调函数filterrequiredfileds。此回调函数测试some(任何)results中的项目是否与requiredfileds中的item具有相同的名称。

missing中的结果是未满足标准的过滤数组(存在于requiredfileds中但按名称不在results数组中)。

如果您只想知道是否存在缺失值,可以像这样检查missing数组长度:!!missing.length

var requiredfileds = [{
    name: 'CVR',
    value: 'cvr_code'
  },
  {
    name: 'NODE POINT VAL',
    value: 'node_point_val'
  },

];

var results = [{
  name: 'CVB',
  data: [12, 11, 233, 445]
}, {
  name: 'CVR',
  data: [125, 1, -45, 4]
}];

var missing = requiredfileds.filter(item => !results.some(resultItem => resultItem.name === item.name));

console.log('Any missing: ' + !!missing.length);

console.log(missing);


3

使用ES6编写一行代码返回布尔值结果:

const result = !requiredfileds.some(i => !results.some(j => j.name === i.name));

一个不满足要求的第一项版本:

const badItem = requiredfileds.find(i => !results.some(j => j.name === i.name));

如果你想要一个错误项的数组,将 .find 替换为 .filter:
const badItems = requiredfileds.filter(i => !results.some(j => j.name === i.name));

我也想得到实际上不满足条件的东西。 - Geoff
@GEOFFREYMWANGI 我进行了更新以获取“错误”的项目/项。 - dhilt

2
我认为你可能想要这样的东西:

var requiredfileds=[
    {name:'CVR', value:'cvr_code'},
    {name:'NODE POINT VAL', value:'node_point_val'}

 ]
 var results = [
    {name:'CVB', data:[12,11,233,445]},
    {name:'CVR', data:[125,1,-45,4]}
   ]
   

var resultsNames = results.map(result => result.name)

requiredfileds.forEach(requiredfiled => {
 if(!resultsNames.includes(requiredfiled.name)) console.log(requiredfiled)
})


0
const entered = results.map(({ name }) => name);

const missing = requiredFields.filter(({name}) => !entered.includes(name))

0

正如@Barmer所建议的那样...你可以使用Array.every。结合Array.some应该可以满足你的需求。

var requiredFields=[
    {name:'CVR', value:'cvr_code'},
    {name:'NODE POINT VAL', value:'node_point_val'},
];

var results = [
    {name:'CVB', data:[12,11,233,445]},
    {name:'CVR', data:[125,1,-45,4]}
];
   
const answer = requiredFields.every(item => results.some(test => item.name === test.name))

console.log(answer);


这样看起来更整洁,但是 console.log 只会给出一个布尔值,如果失败了,我该如何获取失败的对象呢?它不在 results 中,而是在 required 中。 - Geoff
抱歉,@GEOFFREY,我不知道那是一個需求。看起來有其他答案更適合提供你的回答。 - Doug Coburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接