遍历两个对象数组并创建新的数组对象

时间:2020-03-31 08:56:02

标签: javascript jquery arrays object

我有以下两个数组对象

const plan = [
              {Item_ID : 01, Date:"2020-04-01", Items:"10"}, 
              {Item_ID : 02, Date:"2020-04-01", Items:"20"},
              {Item_ID : 03, Date:"2020-04-02", Items:"40"},
              {Item_ID : 05, Date:"2020-04-03", Items:"10"},
             ];

const actual = [{Date:"2020-04-01", Actual_Items:"15"}, 
                {Date:"2020-04-02", Actual_Items:"40"}, 
                {Date:"2020-04-05", Actual_Items:"50"},                    
               ];

这两个数组显示了计划销售和实际销售,基于这两个数组,我试图创建以下数组

 const plan = [
              {Item_ID : 01, Date:"2020-04-01", Items:"10", Actual_Items:"15"}, 
              {Item_ID : 02, Date:"2020-04-01", Items:"20", Actual_Items:"15"},
              {Item_ID : 03, Date:"2020-04-02", Items:"40", Actual_Items:"40"},
              {Item_ID : 05, Date:"2020-04-03", Items:"10", Actual_Items:"0"},
              {Item_ID : null, Date:"2020-04-04", Items:"0", Actual_Items:"0"},
              {Item_ID : null, Date:"2020-04-05", Items:"0", Actual_Items:"50"},
             ];

因此基于计划的数组,如果这些是当天的实际销售量,则显示为0。 如果没有任何计划但销售已完成,则Item_ID将为null物品将为null,但Actual_Items需要显示销售数量。

我创建了波纹管贴图函数,也许是完全错误的逻辑,我无法继续未来,不知道如何创建此最终数组

let op = plan.map((e,i)=>{
      let temp = actual.find(element=> element.Date === e.Date)
      if(temp.Actual_Items) {
        e.Actual_Items= temp.Actual_Items;
      }
      return e;
    })
    console.log(op);

2 个答案:

答案 0 :(得分:1)

您可以像这样加入两个数组:

let op = plan.concat(actual);

let op = [...plan, ...actual];

但是在您想要遍历“实际”以修改值“ Item_ID”和“ Items”之前。

解决方案如下:

const plan = [
              {Item_ID : 01, Date:"2020-04-01", Items:"10"}, 
              {Item_ID : 02, Date:"2020-04-01", Items:"20"},
              {Item_ID : 03, Date:"2020-04-02", Items:"40"},
              {Item_ID : 05, Date:"2020-04-03", Items:"10"},
             ];

const actual = [{Date:"2020-04-01", Actual_Items:"15"}, 
                {Date:"2020-04-02", Actual_Items:"40"}, 
                {Date:"2020-04-05", Actual_Items:"50"},                    
               ];

actual.forEach(function(part, index) {
  part.Items = "0";
  part.Item_ID = null;
  this[index] = part;
}, actual);

let op = plan.concat(actual);

console.log(op);

答案 1 :(得分:1)

您可以将一个对象用于同一日期,收集plan值,然后再添加actual

您最终可以将缺少的日期添加到结果数组中。

const
    plan = [{ Item_ID: "01", Date: "2020-04-01", Items: "10" }, { Item_ID: "02", Date: "2020-04-01", Items: "20" }, { Item_ID: "03", Date: "2020-04-02", Items: "40" }, { Item_ID: "05", Date: "2020-04-03", Items: "10" }],
    actual = [{ Date: "2020-04-01", Actual_Items: "15" }, { Date: "2020-04-02", Actual_Items: "40" }, { Date: "2020-04-05", Actual_Items: "50" }],
    pattern = { Item_ID: null, Date: null, Items: "0", Actual_Items: "0" },
    result = Object
        .values(actual.reduce(
            (r, o) => {
                r[o.Date] = r[o.Date] || [{ ...pattern }];
                r[o.Date].forEach(p => Object.assign(p, o));
                return r;
            },
            plan.reduce((r, o) => {
                (r[o.Date] = r[o.Date] || []).push({ ...pattern, ...o });
                return r;
            }, {})
        ))
        .flat()
        .reduce((r, o, i, { [i - 1]: prev }) => {
            if (!r) return [o];
            var p = new Date(prev.Date).getTime() + 1000 * 60 * 60 * 24;
            while (p < new Date(o.Date).getTime()) {
                let d = new Date;
                d.setTime(p);
                r.push({ ...pattern, Date: d.toISOString().slice(0, 10) });
                p += 1000 * 60 * 60 * 24;
            }
            r.push(o);
            return r;
        }, undefined);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }