基于条件过滤javascript数组

基于条件过滤javascript数组,javascript,arrays,filter,Javascript,Arrays,Filter,我正在生成一个动态数组,如下所示。我想要实现的是比较第一个集合和第二个集合,并基于id将公共项返回到一个新数组中。此外,挂起的和必需的值应大于0 例如,案例:1 let arr = [ { 0: { id: 1, name: "A", required: 1, pending: 1 }, 1: { id: 2, name: "B", required: 0, pending: 0 } }, { 0: { id: 1, n

我正在生成一个动态数组,如下所示。我想要实现的是比较第一个集合和第二个集合,并基于id将公共项返回到一个新数组中。此外,挂起的和必需的值应大于0

例如,案例:1

let arr = [
  {
    0: { id: 1, name: "A", required: 1, pending: 1 },
    1: { id: 2, name: "B", required: 0, pending: 0 }
  },
  {
    0: { id: 1, name: "A", required: 1, pending: 1 },
    1: { id: 2, name: "B", required: 1, pending: 1 },
    2: { id: 3, name: "C", required: 0, pending: 0 }
  }
]
在这种情况下,结果将是A,如下所示

[
{ id: 1, name: "A", required: 1, pending: 1 }
]
另一个案例,案例:2 因为数组是动态生成的。因此,以下是可能的

let arr = [
      {
        0: { id: 1, name: "A", required: 1, pending: 1 },
        1: { id: 2, name: "B", required: 1, pending: 1 },
        2: { id: 3, name: "C", required: 0, pending: 0 }
      }
    ]
这方面的预期产出将是

  [
    { id: 1, name: "A", required: 1, pending: 1 },
    { id: 2, name: "B", required: 1, pending: 1 }
  ]
下面的函数给出了情况1所需的输出。此功能不适用于情况2。有人能帮我解决这个问题吗

let test = arr .reduce((p, c) => p.filter(e =>c.some(s => s.id === e.id && s.pending> 0 && e.pending> 0 && s.required> 0 && e.required> 0)));

您可以使用
map
Object.values
获取嵌套对象和要消除重复的对象的值

var-arr=[{
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:0,挂起:0}
},
{
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:1,待定:1},
2:{id:3,名称:“C”,必需:0,挂起:0}
}
]
map1=新映射()
map2=新地图()
var res=arr.map(o=>Object.values(o).forEach(
s=>{if(s.required>0&&s.pending>0&&!map2.get(s.name))
map1.set(s.name,s)
else map2.set(s.name,s)
}))

console.log([…map1.values()])
除了您的psudo矩阵代码之外,您还可以创建一个简单的筛选器谓词函数,该函数接受一个条目,并在任何条件失败时短路。您需要检查是否违反了条件而不是请求的条件

只需在最后返回
true

至于您的数据,因为您有一个对象数组(对象本身包含对象),所以您需要将每个组映射到一个缩减,以便可以筛选出值(条目)不符合谓词条件的键值对。减少只是一次映射和过滤。您需要减少,因为无法按关键帧过滤对象

const数据=[{
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:0,挂起:0}
}, {
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:1,待定:1},
2:{id:3,名称:“C”,必需:0,挂起:0}
}]
常数大于零=(条目)=>{
if(entry==null)返回false;
如果(entry.required!==1)返回false;
如果(entry.pending<1)返回false;
返回true;
}
console.log(data.map)(组=>{
返回Object.entries(组).reduce((res,entry)=>{
让[键,值]=条目;
返回值大于零(值)
?{…res,[键]:值}:res;
}, {});
}));

作为控制台包装{top:0;最大高度:100%!important;}
使用
forEach
并推送到结果数组

const过滤器=(arr)=>{
常数res=[];
const track={};
arr.forEach((obj)=>
Object.entries(obj.forEach)([i,item])=>{
const isValid=[“必需”,“挂起”]。每((键)=>项[key]>0);
如果(isValid&!(曲目中的item.name)){
res.push({[i]:item});
}
track[item.name]=isValid;
})
);
返回res;
};
设arr1=[
{
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:0,挂起:0},
},
{
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:1,待定:1},
2:{id:3,名称:“C”,必需:0,挂起:0},
},
];
设arr2=[
{
0:{id:1,名称:“A”,必需:1,挂起:1},
1:{id:2,名称:“B”,必需:1,待定:1},
2:{id:3,名称:“C”,必需:0,挂起:0}
}
]
控制台日志(过滤器(arr1));
console.log('-------------');

控制台日志(过滤器(arr2))
let test = arr.reduce((p, c) => p.filter(e =>c.some(s => s.id === e.id && s.pending> 0 && e.pending> 0 && s.required> 0 && e.required> 0)));

let res = arr.length>1?test:(test.filter(s =>  s.pending> 0 && s.required> 0));


您的预期输出是什么?输入数组的语法不正确
{…},{…}
无效,您的意思是
[{…},{…}]
?我想返回其挂起值和必需值>0的元素,否则它应该返回空arrayYeah,当然,但输入数组在javascript中语法无效。这是一个对象数组吗?@ibrahimmahrir我已经更正了数组格式。如果这样,我不想在结果中重复id 1。预期在结果数组中获得id 1和id 2,但由于存在重复id的条目,因此不会平面映射此数据。@Jomol MJ我已修复它,请检查它out@Sven.hig还有一件事,在第一组数组中,B的挂起和必需值是0,在下一组数组中是1。那么,在这种情况下,是否可以排除B而只返回A?@Sven.hig我已经更新了问题,您能研究一下吗?对于这样一个简单的问题来说太复杂了task@Sven.hig一点也不复杂…第一部分是一个简单的解决方案。一个简单谓词怎么会太复杂?@Mr.polywhill你能研究一下更新后的问题并帮助我吗?是否可以删除重复项,并且在第一组数组中,B的待定和必需项为0,在下一组数组中为1。因此,在这种情况下,是否可以排除B而只返回A?@JomolMJ更新了答案以保持一个集合以避免重复。希望有帮助。如果没有正确理解,您可以使用预期的输出更新它吗?[{“0”:{“id”:1,“name”:“A”,“required”:1,“pending”:1},]-这是expected@JomolMJ啊,明白了。我的问题不好,实际上你已经提到了预期产出。以下是处理上述场景的更新版本。:)你能看看更新后的问题,帮我解决这个问题吗?