繁体   English   中英

lodash - 按嵌套项目计数过滤集合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM