[英]lodash - filter collection by nested items count
是否有任何简单的解决方案(vanilla js 或 lodash)来按嵌套项目计数过滤集合?
例如有以下分组集合:
[
{
Items: ['a', 'b', 'c'],
Name: 'Group 1'
},
{
Items: ['d', 'e','f'],
Name: 'Group 2'
}
]
如果我需要携带 2 件物品,它应该返回:
[
{
Items: ['a', 'b'],
Name: 'Group 1'
}
]
如果我需要携带 5 件物品,它应该返回:
[
{
Items: ['a', 'b', 'c'],
Name: 'Group 1'
},
{
Items: ['d', 'e'],
Name: 'Group 2'
}
]
您需要迭代项目(在本例中为 for...of),并计算结果中的项目数 + 当前对象项目的长度。
如果它小于或等于所需的总数( n
),则推送原始对象。 如果它更多,则对嵌套数组进行切片,因此它将包含差异。
如果当前计数等于或大于n
(或者如果循环结束)返回结果( res
)。
const fn = (arr, n, key) => { let count = 0 const res = [] for(const o of arr) { const len = o[key].length res.push(count + len <= n ? o : { ...o, [key]: o[key].slice(0, n - count) }) count += len if(count >= n) return res } return res } const arr = [{"Items":["a","b","c"],"Name":"Group 1"},{"Items":["d","e","f"],"Name":"Group 2"}] console.log(fn(arr, 2, 'Items')) console.log(fn(arr, 5, 'Items')) console.log(fn(arr, 8, 'Items'))
我的解决方案,也许不完美,但它有效:)
let array = [
{
Items: [
'a',
'b',
'c'
],
Name: 'Test1'
},
{
Items: [
'd',
'e',
'f'
],
Name: 'Test2'
}
];
let itemsCount = 5;
let filteredArray = [];
array.some(group => {
if (itemsCount <= 0) {
return true;
}
if (group.Items.length <= itemsCount) {
itemsCount -= group.Items.length;
} else {
group.Items = group.Items.slice(0, itemsCount);
itemsCount = 0;
}
filteredArray.push(group);
});
console.log(filteredArray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.