Javascript 在条件复杂的两个对象数组之间检索项

Javascript 在条件复杂的两个对象数组之间检索项,javascript,arrays,typescript,performance,optimization,Javascript,Arrays,Typescript,Performance,Optimization,我有两张物品清单: let list1 = [{id: '1', status: 'use', comment: 'xxxx'}, {id: '2', status: 'ready', comment: 'yyyy'}, {id: '3', status: 'ready', comment: 'zzzz'}]; let list2 = [{uid: '1', elec: 60}, {uid: '2', elec: 60}, {uid: '10', elec: 60}, {uid: '3', el

我有两张物品清单:

let list1 = [{id: '1', status: 'use', comment: 'xxxx'}, {id: '2', status: 'ready', comment: 'yyyy'}, {id: '3', status: 'ready', comment: 'zzzz'}];
let list2 = [{uid: '1', elec: 60}, {uid: '2', elec: 60}, {uid: '10', elec: 60}, {uid: '3', elec: 40}];

我想要检索的是list2的一个对象,它的elec>50,并且uid与list1的一个项目id相同,只有当list1的项目的状态为==“就绪”时。此外,我还想将list1对象中的参数“comment”添加到此项中

在这个示例中,我的结果值是:{uid:'2',elect:60,comment:'yyyy'}

我这样做:

  let list1Filtered = list1.filter(itemList1 => itemList1.status == 'ready');
  let list2Filtered = list2.filter(itemList2 => itemList2.elec > 50);
  var result;

  for ( let  itemList1Filtered of list1Filtered ) {
    for ( let  itemList2Filtered of list2Filtered ) {
      if (!result && itemList1Filtered.id == itemList2Filtered.uid) {
        result = itemList2Filtered;
        result.comment = itemList1Filtered.comment;
      }
    }
  }
  
  return result;
我想知道是否有一种更优雅和/或更复杂的方法可以在Javascript中实现这一点。

试试这个:

让列表1=[
{id:'1',状态:'use',注释:'xxxx'},
{id:'2',状态:'ready',注释:'yyyy'},
{id:'3',状态:'ready',注释:'zzzz'},
];
让列表2=[
{uid:'1',elec:60},
{uid:'2',elec:60},
{uid:'10',elec:60},
{uid:'3',elec:40},
];
设result=null;
让我们找到它;
常量filteredList=list2.filter((list2Item)=>{
如果(!结果){
项目发现=
list2Item.elec>50&&
清单1.find(
(列表1项目)=>
list2Item.uid===list1Item.id&&list1Item.status==='ready'
);
如果(找到项){
结果={
uid:list2Item.uid,
选择:list2Item.elec,
comment:itemFound.comment,
};
}
}
});

控制台日志(结果)这应该可以完成以下工作:

const list1=[{
id:'1',
状态:“使用”,
评论:“xxxx”
}, {
id:'2',
状态:“就绪”,
注释:“yyy”
}, {
id:'3',
状态:“就绪”,
评论:“zzzz”
}];
常数列表2=[{
uid:'1',
电子:60
}, {
uid:'2',
电子:60
}, {
uid:'10',
电子:60
}, {
uid:'3',
电子:40
}];
常量filteredList=list2.filter(项=>{
const readyItemsList1=list1.filter(item=>item.status==='ready').map(item=>item.id);
返回item.elec>50&&readyItemsList1.indexOf(item.uid)>-1
}).map(项目=>{
const comment=list1.find(it=>it.id==item.uid);
item.comment=注释;
退货项目;
});

console.log(filteredList)
过滤器
映射
将帮助您

filter
可以选择符合某些条件的项目,并且
map
允许您更改要拾取的数据

对于
list1
,选择状态为
status
等于
'ready'
的项目,然后只获取
id

var ready_id_array = list1.filter(item=>item.status == 'ready').map(item=>item.id);
对于
list2
,检查
ready\u id\u array
中包含的
uid
,以及
elec
是否大于50

var result = list2 .filter(item => ready_id_array.indexOf(item.uid) > -1 && item.elec > 50);
要附加注释,需要创建一个字典,然后将注释放回结果

var comment_dictionary = list1.reduce((a,x) => ({...a, [x.id]: x.comment}), {});
result.forEach(item => item.comment = comment_dictionary[item.uid]);
你会得到结果的

[{uid: "2", elec: 60, comment: "yyyy"}]

您可以从列表1中收集想要的注释,并通过检查
elec
的值以及其他列表中是否存在项来减少
list2
。然后返回一个新对象

这种方法只需要两个循环

const
列表1=[{id:'1',状态:'use',注释:'xxxx'},{id:'2',状态:'ready',注释:'yyyy'},{id:'3',状态:'ready',注释:'zzzzzz'}],
列表2=[{uid:'1',elec:60},{uid:'2',elec:60},{uid:'10',elec:60},{uid:'3',elec:40}],
l1=list1.reduce((r,{id,status,comment})=>{
if(status==='ready')r[id]={comment};
返回r;
}, {}),
结果=列表2.减少((r,o)=>{
如果(o.elec>50&&o.uid在l1中)r.push({…o,…l1[o.uid]})
返回r;
}, []);
控制台日志(结果)

让列表1=[{
id:'1',
状态:“使用”,
评论:“xxxx”
}, {
id:'2',
状态:“就绪”,
注释:“yyy”
}, {
id:'3',
状态:“就绪”,
评论:“zzzz”
}];
让列表2=[{
uid:'1',
电子:60
}, {
uid:'2',
电子:60
}, {
uid:'10',
电子:60
}, {
uid:'3',
电子:40
}];
常量itemList={}
列表1.forEach(项目=>{
如果(item.status=='ready'){
itemList[item.id]=item.comment
}
});
const result=list2.filter(item=>itemList[item.uid]&&item.elec>50).map(item=>{
item['comment']=itemList[item.uid]
退货项目
})

console.log(result)
如果有多个项目符合标准,该怎么办?同样,您的
>60
也意味着示例中没有一个项目匹配。您需要
=60
@GabrielePetrioli:应该选择第一个。我用过!仅产生1次if集合结果。对于60,你是对的,这是一个打字错误,我用
>50
修复了它。很抱歉,请不要检查
!结果
您只需执行
返回结果即可let result = {
    ...list2.filter(
    a => a.elec > 50 && a.uid === list1.filter(b => b.status === "ready")[0].id)[0],
    comments: list1.filter(b => b.status === "ready")[0].comment
}

you can restructure your data. List1 convert it in object. And now we can find solution in O(n).