Перебрать два массива объектов и создать новый объект массива - PullRequest
3 голосов
/ 31 марта 2020

у меня есть следующие два объекта массива

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 должен показывать количество продаж.

Я создал нижеприведенную функцию карты, возможно, совершенно неправильную логику c и не смог продолжить в будущем, есть идеи, как создать этот окончательный массив

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 ]

1 голос
/ 31 марта 2020

Вы можете использовать объект для той же даты, собрать значения 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; }
1 голос
/ 31 марта 2020

Вы можете объединить два массива следующим образом:

let op = plan.concat(actual);

или

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

Но прежде чем вы захотите перебрать «фактическое», измените значения «Item_ID» и «Предметы».

Решение выглядит так:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...