![](/img/trans.png)
[英]Lodash / Javascript - how to find unique keys nested inside objects
[英]How to find objects inside nested array of objects using lodash?
我有这个数据集
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
}
]
}
]
我有一个对象的数组(records)
,并且在每个对象中都有另一个数组(cards)
。 这意味着如果我将始终在“记录”中存在的对象内放置cards
阵列。 因此,从一开始我就想遍历整个列表records
,并将所有对象的cards数组相互比较,然后找到匹配的对象的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 key
的重低音上比较纸牌数组对象
该版本基于对问题的评论中的长期需求讨论之后达成的理解。 它不使用lodash。 它已经变得足够复杂,可能会分解成较小的部分,而lodash可能会对此有所帮助。
它不仅包括gc
,还包括原始记录中的time
,实际上,它将包括那里的其他任何内容。 如果只需要gc
,只需从代码中删除...rest
即可。
const sharedCards = records => Object.values( 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, [code, rs]) => { const {gc, rssi, ...rest} = rs.reduce( (r1, r2) => r2.rssi < r1.rssi ? r2 : r1, {rssi: Infinity} ) return { ...a, [gc]: { ...(a[gc] || {...rest, gc}), cards: [...((a[gc] || {gc}).cards || []), {cardCode: code, rssi}] } } }, {}) ) const 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: 3}, {cardCode: "6423", rssi: 23}, {cardCode: "12421", rssi: 67}]}]; console .log ( sharedCards (records) ) // Now we add `{cardCode: "6423", rssi: 7}` to the first record const records2 = [{gc: "2", time: 1231232423, cards: [{cardCode: "6423", rssi: 7}, {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: 3}, {cardCode: "6423", rssi: 23}, {cardCode: "12421", rssi: 67}]}]; console .log ( sharedCards (records2) )
这只是部分解决方案,如果我们可以解决评论中的讨论,请予以更新。 它获取出现在每条记录中的所有卡,并选择rssi最低的版本。 这可能接近要求,也可能不接近。
它不使用lodash。 使用lodash可能会简化一点,但可能不会很多。
const sharedCards = records => Object .entries (records .reduce ( (a, {cards}) => cards .reduce ( (a, {cardCode, rssi}) => ({...a, [cardCode]: [...(a[cardCode] || []), rssi]}), a, ), {} )) .filter ( ([code, rssis]) => rssis.length == records.length ) .map ( ([code, rssis]) => ({ cardCode: code, rssi: Math .min (...rssis) }) ) const 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: 3}, {cardCode: "6423", rssi: 23}, {cardCode: "12421", rssi: 67}]}]; console .log ( sharedCards (records) ) // Now we add `{cardCode: "6423", rssi: 7}` to the first record const records2 = [{gc: "2", time: 1231232423, cards: [{cardCode: "6423", rssi: 7}, {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: 3}, {cardCode: "6423", rssi: 23}, {cardCode: "12421", rssi: 67}]}]; console .log ( sharedCards (records2) )
与洛达什
let 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":3},{"cardCode":"6423","rssi":23},{"cardCode":"12421","rssi":67}]}] let mapped = _.reduce(records, (acc, rec) => { _.forEach(rec.cards, (card) => { card = _.assign({}, card, { gc: rec.gc, multiple: false }) if (card.cardCode in acc) { let lc = acc[card.cardCode].rssi < card.rssi acc[card.cardCode] = lc ? acc[card.cardCode] : card acc[card.cardCode].multiple = lc } else { acc[card.cardCode] = card; } }) return acc }, {}) let result = _.reduce(records, (acc, rec) => { rec.cards = _.filter(rec.cards, (card) => mapped[card.cardCode].multiple && mapped[card.cardCode].gc === rec.gc ) rec.cards.length && acc.push(rec) return acc }, []); console.log(result)
.as-console-wrapper { max-height: 100%!important }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.