Как я могу обновить массив объектов другим массивом объектов, используя lodash? - PullRequest
0 голосов
/ 20 сентября 2019

Я хотел бы заменить значения первого массива вторым массивом, если ключи совпадают

Массив, который будет использоваться для обновления.

[
  {
    "19": 0,
  },
  {
    "20": 0,
  },
  {
    "21": 0,
  },
  {
    "22": 0,
  },
  {
    "23": 0,
  },
  {
    "24": 0,
  },
...

Массив, которыйсодержит данные, использованные для обновления первого массива.

[
  {
    "19": 2,
  },
  {
    "20": 1,
  },
  {
    "23": 1,
  },
]

Результат, который я хотел бы получить.

[
  {
    "19": 2,
  },
  {
    "20": 1,
  },
  {
    "21": 0,
  },
  {
    "22": 0,
  },
  {
    "23": 1,
  }
...

Это то, что я написал, но не смог добиться успеха, код возвращаетмассив со всеми обновленными значениями, даже теми, которые не должны обновляться.

const fakeData = [
    {
        "createdAt": "2019-09-19T22:51:00.386Z",
        "name": "Yank",
    },
    {
        "createdAt": "2019-09-19T22:51:00.386Z",
        "name": "Yank",
    },
    {
        "createdAt": "2019-09-20T22:51:00.386Z",
        "name": "Yank",
    },
    {
        "createdAt": "2019-09-23T22:51:00.386Z",
        "name": "Yank",
    }
]

const map = fakeData
    .map(item => new Date(item.createdAt).getDate())
    .map(item => item)
    .reduce((prev, cur) => { prev[cur] = (prev[cur] || 0) + 1; return prev; }, {});
const arrayOfObj = Object.entries(map).map((e) => ({ [e[0]]: e[1] }));
const newArrayWithValueCero = arrayNumberdays.map((item) => ({ [item]: 0 }))

newArrayWithValueCero.map((items, key) => {
    const keysOfItems = Object.keys(items)[0] // 1,2,3,4,5,6,7...
    const keysOfArrayOfObj = Object.keys(arrayOfObj[key] === undefined ? { "-": "0" } : arrayOfObj[key])[0] // 1,2,3, ------....

    return keysOfItems === keysOfArrayOfObj
        ? { [Object.keys(items)[0]]: Object.values(arrayOfObj[key] === undefined ? { [[Object.keys(items)[0]][0]]: "0" } : arrayOfObj[key])[0] }
        : items
})

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете сделать что-то вроде этого:

var list = [
   {"19": 0},
   {"20": 0},
   {"21": 0},
   {"22": 0},
   {"23": 0},
   {"24": 0}
]

var check = [
 {"19": 2},
 {"20": 1},
 {"23": 1},
]

var updateList = check.reduce((acc, val) => {
    var key = Object.keys(val)[0];
    if(!acc[key]) acc[key] = 0
    acc[key] = acc[key] + val[key]
    return acc;
},{})

var res = list.map((val) => {
    var key = Object.keys(val)[0];
    return {
        [key]: val[key] + (updateList[key] || 0)
    }
})
...