首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按状态使用reduce进行分组

按状态使用reduce进行分组
EN

Code Review用户
提问于 2021-12-06 22:39:26
回答 1查看 48关注 0票数 2

我一直在使用reduce()方法按Open状态(Status_111Status_222等)分组,然后创建一个与其关联的it (item.Id)数组。

代码正在工作,并且具有预期的结果,但是,我觉得代码编写得更好,因为正如您可以看到的那样,如果创建空白数组的条件用于检查if (item.Open && !obj[item.Open])if (item.Close && !obj[item.Close])存在,那么我使用了太多的条件--您将如何改进代码?

代码语言:javascript
运行
复制
const items = [
  { Id: 100, Open: 'Status_111', Close: 'Status_111' },
  { Id: 200, Open: 'Status_111', Close: 'Status_222' },
  { Id: 300, Open: 'Status_333', Close: 'Status_444' }
]

function groupByOpenAndClose(items) {
  return items.reduce(function (obj, item) {
    if (item.Open && !obj[item.Open]) {
        obj[item.Open] = {
          Open: [],
          Close: []
        }
    }

    if (item.Close && !obj[item.Close]) {
      obj[item.Close] = {
        Open: [],
        Close: []
      }
    }

    if (obj[item.Open]) {
      obj[item.Open].Open.push(item.Id)
    }

    if (obj[item.Close]) {
      obj[item.Close].Close.push(item.Id)
    }

    return obj
  }, {});
}

console.log(groupByOpenAndClose(items));
EN

回答 1

Code Review用户

回答已采纳

发布于 2021-12-07 18:56:07

如下所示:

代码语言:javascript
运行
复制
function groupByOpenAndClose(items) {
  return items.reduce((obj, item) => {
    return {
      ...obj,
      [item.Close]: {
        Close: [...(obj[item.Close]?.Close ?? []), item.Id],
        Open: obj[item.Close]?.Open ?? []
      },
      [item.Open]: {
        Open: [...(obj[item.Open]?.Open ?? []), item.Id],
        Close: obj[item.Open]?.Close ?? []
      }
    }
  }, {});
}

但是,严肃地说,如果不创建自己的一些结构(类似于python中的默认dict ),就没有什么可以做的:

代码语言:javascript
运行
复制
class DefaultDict {
  constructor(defFactory) {
    this.defFactory = defFactory;
    this.dict = {}
  }
  
  getOrDefault(status) {
    if(!status) return;
    if(!this.dict[status]) this.dict[status] = this.defFactory();
    
    return this.dict[status];
  }
}

function groupByOpenAndClose(items) {
  return items.reduce(function(obj, item) {
    obj.getOrDefault(item.Close)?.Close.push(item.Id);
    obj.getOrDefault(item.Open)?.Open.push(item.Id);
    return obj;
  }, new DefaultDict(() => ({ Close: [], Open: [] })));
}

console.log(groupByOpenAndClose(items).dict);
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/270747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档