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);
  }
})