Javascript 如何使用lodash查找嵌套对象数组中的对象?
我有这个数据集Javascript 如何使用lodash查找嵌套对象数组中的对象?,javascript,lodash,Javascript,Lodash,我有这个数据集 var records = [{ gc: '2', time: 1231232423, cards: [{ cardCode: '12121', rssi: 23 }, { cardCode: '12122', rssi: 33 }, { cardCode: '12421', rssi: 43 } ] },
var records = [{
gc: '2',
time: 1231232423,
cards: [{
cardCode: '12121',
rssi: 23
}, {
cardCode: '12122',
rssi: 33
}, {
cardCode: '12421',
rssi: 43
}
]
},
{
gc: '3',
time: 4331232233,
cards: [{
cardCode: '6423',
rssi: 23
}, {
cardCode: '12421',
rssi: 13
}
]
}, , {
gc: '4',
time: 4331232233,
cards: [{
cardCode: '8524',
rssi: 03
},
{
cardCode: '6423',
rssi: 23
}, {
cardCode: '12421',
rssi: 67
}
]
}
]
我有一个对象数组(记录)
,每个对象中都有另一个数组(卡片)
。这意味着如果“记录”中的对象中始终有卡数组。因此,从一开始,我想迭代整个列表记录
,并将所有对象的卡片数组相互比较,然后找到匹配对象的rssi
值,并将该对象(具有最小rssi值)推到另一个新数组中。以同样的方式,在最后我想要一个数组,在这个数组中我有所有匹配的对象,这些对象具有最小的rssi值。我正在使用lodash
,并且已经尝试过了
matchedRecords = records.forEach(record=>{
record.cards.forEach(record=>{
_.filter(records, _.flow(
_.property('cards'),
_.partialRight(_.some, { cardCode: record.cardCode })
));
})
})
我期望的结果是
[
{
gc : 3,
cards : [{
cardCode : '12421',
rssi : 13
}]
}
]
注意:卡数组对象应在cardCode键的基础上进行比较
已更新
本版本基于对问题的评论中经过长时间的需求讨论后达成的理解。它不使用lodash。它变得足够复杂,可能会被分解成更小的碎片,而洛达斯可能会对此有所帮助
它不仅包括原始记录中的gc
,还包括原始记录中的time
,事实上,它还包括原始记录中的任何其他内容。如果只需要gc
,只需从代码中删除…rest
constsharedcards=records=>
对象值(
Object.entries(records.reduce(
(a,{cards,…rest})=>cards.reduce(
(a,{cardCode,rssi})=>({
A.
[cardCode]:[…(a[cardCode]| |[]),{…rest,rssi}]
}),
A.
),
{}
))
.filter(([code,rs])=>rs.length==records.length)
.reduce((a[代码,rs])=>{
常量{gc,rssi,…rest}=rs.reduce(
(r1,r2)=>r2.rssi
含Lodash
let records=[{“gc”:“2”,“time”:1231232423,“cards”:[{“cardCode”:“12121”,“rssi”:23},{“cardCode”:“12122”,“rssi”:33},{“cardCode”:“12421”,“rssi”:43}},{“gc”:“3”,“time”:433122233,“cards”:[{“cardCode”:“6423”,“rssi”:23},{“cardCode”:“12421”,“rssi”:13},{“gc”:“4”,“time”:4331233},{“cardCode”:“cards”:“cardCode,{“cardCode”:“12421”,“rssi”:67}]]
让映射=\减少(记录,(acc,rec)=>{
_.forEach(记录卡,(卡)=>{
card=\分配({},card,{gc:rec.gc,multiple:false})
if(acc中的card.cardCode){
设lc=acc[card.cardCode].rssi{
rec.cards=\.filter(rec.cards,(card)=>mapped[card.cardCode]。多个&mapped[card.cardCode]。gc===rec.gc)
记录卡长度和附件推送(记录)
返回acc
}, []);
console.log(结果)
。作为控制台包装器{
最大高度:100%!重要
}
卡码:'8524'
的rssi应为30?如果为3,则应为最小值。不,我必须遍历整个记录
数组,并在每个卡数组中找到匹配的卡,并找到具有最小rssi的对象。在我的上述数据集中,具有卡码
的对象等于12421
存在于记录的所有三个对象中,因此code应该返回具有最小rssi值的对象您知道只有一张匹配的卡吗?如果不知道,结果中的gc:3
来自何处?一张卡的最低rssi
可能位于与最低rss不同的记录中不,我不知道什么是匹配的卡片,因为卡片数组在记录的每个对象中都是动态的,因为代码应该首先比较并获得匹配的记录,所以在我给定的数据集中,只有一个对象具有cardCode
:“12421”存在。基本上,我想在cardC的基础上匹配记录ode
您可以看到12421
的对象存在于记录中的所有三个对象中,通过比较每个对象的rssi,最小rssi为13,而cardCode:12421
您的解决方案工作得很好,但它不能给出每个对象的gc内部结果。结果应该与第一个类似t格[{“gc”:“3”,卡片:[{“cardCode”:“12421”,“rssi”:“13}]},在第二格中,结果应该是[{“gc”:“2”,“cards”:[{“cardCode”:“6423”,“rssi”:“7}]},{“gc”:“3”,“cards”:[{“cardCode”:“12421”,“rssi”:“13}]}]@FahadHassanSubzwari:在得到全部要求之前,我写了你看到的版本。我甚至提到了tha