微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要帮助理解按给定值在数组或对象中分组项目的解决方案

如何解决需要帮助理解按给定值在数组或对象中分组项目的解决方案

在花了几个小时试图解决 This Question 之后,我决定看看解决方案,但我似乎无法通过我厚厚的头骨获得解决方案的一部分。

解决方

const myGroupBy = (collection,q) => {
  collection = Object.values(collection);
  switch (typeof q) {
    case "string":
      return collection.reduce((a,c) => (a[c[q]] = [...(a[c[q]] || []),c],a),{});
    case "function":
      return collection.reduce((a,c) => (a[q(c)] = [...(a[q(c)] || []),{});
    default:
      const [[k,v]] = Object.entries(q);
      return collection.reduce((a,c) => (a[c[k] === v] = [...(a[c[k] === v] || []),{});
  }
};

我不明白的部分(a[c[q]] = [...(a[c[q]] || []),a)

任何帮助将不胜感激。

解决方法

当数组可能尚不存在时,将新项添加到数组是一种难以理解的方式。

.reduce((a,c) => (a[c[q]] = [...(a[c[q]] || []),c],a),{});

是,未缩小:

.reduce((a,c) => {
  const prop = c[q];
  if (!a[prop]) {
    // array doesn't exist yet; create it
    a[prop] = [];
  }
  // it definitely exists now. Now,push the new item to it
  a[prop].push(c);
  // return the accumulator
  return a;
},{});

此处的其他 .reduce 使用了相同的模式。

.reduce 可能在这里不太合适,但简单的循环会更有意义,因为累加器永远不会改变。

const obj = {};
for (const c of collection) {
  const prop = c[q];
  if (!obj[prop]) {
    // array doesn't exist yet; create it
    obj[prop] = [];
  }
  // it definitely exists now. Now,push the new item to it
  obj[prop].push(c);
}
return obj;

这些方法确实改变了累加器上的现有数组,而不是重新分配全新的数组(就像您的原始代码所做的那样) - 但由于数组一开始是空的,它不会有任何影响(正面或负面)。>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。