Javascript TS-通过对象数组循环&;如果未找到,则添加到新数组
向我提供了以下对象的数组:Javascript TS-通过对象数组循环&;如果未找到,则添加到新数组,javascript,arrays,database,typescript,object,Javascript,Arrays,Database,Typescript,Object,向我提供了以下对象的数组: export interface Part { workOrder?: string; task?: string; partNumber?: string; qty?: number; image?: string; name?: string; } 我希望能够循环使用其中的每一个,并从以下界面创建一个新数组: export interface WorkOrder { workOrder?: string; tasks?: Arra
export interface Part {
workOrder?: string;
task?: string;
partNumber?: string;
qty?: number;
image?: string;
name?: string;
}
我希望能够循环使用其中的每一个,并从以下界面创建一个新数组
:
export interface WorkOrder {
workOrder?: string;
tasks?: Array<string>;
}
我希望能够将每个部分的工作订单和任务添加到工作订单
数组中,但是如果已经添加了W1,那么我需要它将第二个任务“其他东西”从W1对象添加到任务数组中
最终结果应如下所示:
workOrders = [
{ workOrder: "W1", tasks: [ "do something", "something else" ] },
{ workOrder: "W2", tasks: [ "do something", "something else" ] }
];
我几乎可以使用一些for循环并检查某些数组的
.indexOf()
,但我觉得可能有更好的方法。您可以使用reduce
方法通过workOrder
创建包含数据的对象:
var result = partList
.reduce<{ [name: string]: WorkOrder }>((map, r) => {
let extsing = map[r.workOrder];
if (extsing) {
extsing.tasks.push(r.task);
} else {
map[r.workOrder] = {
tasks: [r.task],
workOrder: r.workOrder
};
}
return map;
}, {});
var asArray = Object.values(result)
您可以使用
reduce
方法通过workOrder
创建包含数据的对象:
var result = partList
.reduce<{ [name: string]: WorkOrder }>((map, r) => {
let extsing = map[r.workOrder];
if (extsing) {
extsing.tasks.push(r.task);
} else {
map[r.workOrder] = {
tasks: [r.task],
workOrder: r.workOrder
};
}
return map;
}, {});
var asArray = Object.values(result)
您可以使用
reduce
功能
看看这个代码片段
let partList=[
{工作顺序:“W1”,任务:“做点什么”},
{工作顺序:“W1”,任务:“其他”},
{工作顺序:“W2”,任务:“做点什么”},
{工作顺序:“W2”,任务:“其他”},
{工作顺序:“W3”,任务:“其他三(3)”项}
];
让工作顺序=零件列表。减少((a,c)=>{
var current=a.find((e)=>e.workOrder==c.workOrder);
如果(当前)
当前.tasks.push(c.task);
其他的
a、 推送({workOrder:c.workOrder,tasks:[c.task]});
返回a;
}, []);
控制台日志(工作指令)代码>
。作为控制台包装器{
最大高度:100%!重要
}
您可以使用reduce
功能
看看这个代码片段
let partList=[
{工作顺序:“W1”,任务:“做点什么”},
{工作顺序:“W1”,任务:“其他”},
{工作顺序:“W2”,任务:“做点什么”},
{工作顺序:“W2”,任务:“其他”},
{工作顺序:“W3”,任务:“其他三(3)”项}
];
让工作顺序=零件列表。减少((a,c)=>{
var current=a.find((e)=>e.workOrder==c.workOrder);
如果(当前)
当前.tasks.push(c.task);
其他的
a、 推送({workOrder:c.workOrder,tasks:[c.task]});
返回a;
}, []);
控制台日志(工作指令)代码>
。作为控制台包装器{
最大高度:100%!重要
}
您可以使用find方法查找是否添加了元素,如果添加了元素,则推送到任务或创建新工单
您可以使用find方法查找是否添加了元素,如果添加了,则推到任务或创建新的工作订单。输出数组的顺序是否重要?否。我根本不关心输出数组的顺序是否重要?否。我根本不关心顺序。如果有很多组,我会担心查找
的性能。还有,为什么不只是a.push
,为什么每次迭代都要创建一个新数组?@TitianCernicova Dragomir感谢您的观察。a) 当然,find
会影响大型团队的绩效。b) 你完全正确,新数组是不必要的。如果有很多组,我会担心find
的性能。还有,为什么不只是a.push
,为什么每次迭代都要创建一个新数组?@TitianCernicova Dragomir感谢您的观察。a) 当然,find
会影响大型团队的绩效。b) 你完全正确,新阵列是不必要的。
function group<T>(data: T[]) {
return {
byKey(keyGetter: (e: T) => string) {
return {
createGroup<TResult>(ctor: (e: T) => TResult) {
return {
addToGroup(adder: (e: T, c: TResult) => void) {
var result = data
.reduce<{ [name: string]: TResult }>((map, r) => {
let key = keyGetter(r)
let extsing = map[key];
if (extsing) {
adder(r, extsing);
} else {
map[key] = ctor(r);
}
return map;
}, {});
return Object.values(result)
}
}
}
}
}
}
}
let result = group(partList)
.byKey(x => x.workOrder)
.createGroup(x => <WorkOrder>{ tasks: [x.task], workOrder: x.workOrder })
.addToGroup((e, c) => c.tasks.push(e.task));
partList.forEach(elm => {
if (!workOrders.find(wo => wo.workOrder == elm.workOrder)) {
workOrders.push({ workOrder: elm.workOrder, tasks: new Array(elm.task)
});
} else {
workOrders.find(wo => wo.workOrder ==
elm.workOrder).tasks.push(elm.task);
}
})