我一直在使用reduce()方法按Open状态(Status_111、Status_222等)分组,然后创建一个与其关联的it (item.Id)数组。
代码正在工作,并且具有预期的结果,但是,我觉得代码编写得更好,因为正如您可以看到的那样,如果创建空白数组的条件用于检查if (item.Open && !obj[item.Open])和if (item.Close && !obj[item.Close])存在,那么我使用了太多的条件--您将如何改进代码?
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));发布于 2021-12-07 18:56:07
如下所示:
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 ),就没有什么可以做的:
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);https://codereview.stackexchange.com/questions/270747
复制相似问题