【问题标题】:Javascript check if each element of an object array is contained in another arrayJavascript 检查对象数组的每个元素是否包含在另一个数组中
【发布时间】:2018-06-20 02:01:59
【问题描述】:

我有两个包含对象的数组

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

但是上面的不行,我该怎么做

【问题讨论】:

  • 尝试使用.every()
  • @Barmar .every 如果所有值都通过测试,则返回 true,我认为这不会为操作提供他们正在寻找的东西。
  • 没有看到他也想要缺失姓名的列表,而不仅仅是一个真/假结果。

标签: javascript arrays


【解决方案1】:

试试这个:filter requiredfileds 通过应用回调函数。此回调函数测试results 中的some(any) 项是否与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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我也想得到实际不满足条件
    • @GEOFFREYMWANGI 我进行了更新以获取“错误”项目
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      正如@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 失败了,它只会给出一个布尔值,但是我如何获得失败的对象,而不是结果但它是必需的
      • 对不起@GEOFFREY,我不知道这是一个要求。看起来还有其他更适合您的答案。
      【解决方案5】:
      const entered = results.map(({ name }) => name);
      
      const missing = requiredFields.filter(({name}) => !entered.includes(name))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 2017-03-03
        • 2023-03-08
        • 2021-01-30
        • 1970-01-01
        相关资源
        最近更新 更多