Javascript检查对象数组的每个元素是否包含在另一个数组中

时间:2018-06-19 16:41:04

标签: javascript arrays

我有两个带有对象的数组

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]}
   ]

现在,我要检查以确保所需字段数组中的所有名称都在结果数组中。因此,从以上两个示例中,我希望它为假,并使必填字段丢失为{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;
  })
})

但是以上方法不起作用,我该如何进行

5 个答案:

答案 0 :(得分:4)

请尝试以下操作:通过应用回调函数来filter requiredfileds。此回调函数测试results中的some(任意)项是否与item中的requiredfileds具有相同的名称。

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);

答案 1 :(得分:1)

恕我直言,您可能想要这样的东西:

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)
})

答案 2 :(得分:1)

具有布尔结果值的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));

答案 3 :(得分:0)

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

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

答案 4 :(得分: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);