Javascript 我应该使用reduce进行映射吗?

Javascript 我应该使用reduce进行映射吗?,javascript,node.js,Javascript,Node.js,只是想知道我应该坚持使用reduce进行映射吗 代码相当长。有没有办法把它重构得更干净一点 const项=[ {Name:“一”}, {错误:true,代码:“无效1”}, {Name:“两个”}, {名称:“三”}, {错误:true,代码:“其他无效”}, ] const filtered=items.reduce((acc,item)=>{ 如果(item.error==true){ 如果(!acc.errors){ acc.errors=[]; } 附件错误推送(项目); 返回acc;

只是想知道我应该坚持使用reduce进行映射吗

代码相当长。有没有办法把它重构得更干净一点

const项=[
{Name:“一”},
{错误:true,代码:“无效1”},
{Name:“两个”},
{名称:“三”},
{错误:true,代码:“其他无效”},
]
const filtered=items.reduce((acc,item)=>{
如果(item.error==true){
如果(!acc.errors){
acc.errors=[];
}
附件错误推送(项目);
返回acc;
}
如果(!附件项){
附件项目=[];
}
附件项目推送(项目);
返回acc;
}, {});

console.log(过滤)
由于减速器两个部件之间的唯一区别是您按下的键,因此提取
选择,并使一切都取决于

const items=[{“Name”:“one”},{“error”:true,“code”:“INVALID 1”},{“Name”:“two”},{“Name”:“three”},{“error”:true,“code”:“INVALID OTHER”}]
const filtered=items.reduce((acc,item)=>{
const key=item.error?'errors':'items'
如果(!acc[key])acc[key]=[]
acc[键]。推送(项目)
返回acc
}, {})

console.log(过滤)
由于减速器两个部件之间的唯一区别是您按下的键,因此提取
选择,并使一切都取决于

const items=[{“Name”:“one”},{“error”:true,“code”:“INVALID 1”},{“Name”:“two”},{“Name”:“three”},{“error”:true,“code”:“INVALID OTHER”}]
const filtered=items.reduce((acc,item)=>{
const key=item.error?'errors':'items'
如果(!acc[key])acc[key]=[]
acc[键]。推送(项目)
返回acc
}, {})

console.log(已过滤)
是唯一确定它属于哪个对象的方法,只是确定该对象是否包含
错误
键?如果是这样,那么像这样的事情呢:

const项=[
{Name:“一”},
{错误:true,代码:“无效1”},
{Name:“两个”},
{名称:“三”},
{错误:true,代码:“其他无效”},
];
常数筛选={
错误:items.filter(i=>Object.keys(i).includes('error')),
items:items.filter(i=>!Object.keys(i).includes('error'))
}

console.log(过滤)
是唯一确定它属于哪个对象的方法,只是确定该对象是否包含
错误
键?如果是这样,那么像这样的事情呢:

const项=[
{Name:“一”},
{错误:true,代码:“无效1”},
{Name:“两个”},
{名称:“三”},
{错误:true,代码:“其他无效”},
];
常数筛选={
错误:items.filter(i=>Object.keys(i).includes('error')),
items:items.filter(i=>!Object.keys(i).includes('error'))
}

console.log(过滤)
So,你想把你的数组分成两个-错误和项目吗?@VLAZ是的,你想把你的数组分成两个-错误和项目吗?@VLAZ是的,你还可以进一步简化-你知道你只有两个可能的键,所以把初始参数作为
{errors:[],items:[]}
,,因此,您不需要在每次迭代中运行
if
。也可以进一步简化-您知道您只有两个可能的键,因此将初始参数传递为
{errors:[],items:[]}
,这样您就不需要在每次迭代中运行
if
。如果(几乎)有相同的谓词两次,您可以将其提取到
predicate=i=>Object.keys(i).includes('error')
中,然后使用
not=fn=>(…args)=>!fn(…args)
来翻转结果,这样您就可以调用
items.filter(predicate)
items.filter(not(predicate))
@VLAZ这是一个很好的观点——我正试图保持谓词逻辑内联,以使其尽可能少的代码行(尽管您肯定会认为我引入的冗余不太漂亮)为了进一步简化它,将keys()替换为i@OriDrori中的
'error',还包括一个用于提取它的参数。您不需要为此更改两次逻辑。如果您有(几乎)两次相同的谓词,您可以将其提取到
predicate=i=>Object.keys(i).includes('error')
,然后使用
not=fn=>(…args)=>!fn(…args)
来翻转结果,这样您就可以调用
items.filter(predicate)
items.filter(not(predicate))
@VLAZ这是一个很好的观点——我正试图保持谓词逻辑内联,以使其尽可能少的代码行(尽管您肯定会认为我引入的冗余不太漂亮)为了进一步简化它,将keys()替换为i
@OriDrori中的
'error',还包括一个用于提取它的参数。您不需要为此更改两次逻辑。