Как протолкнуть несуществующие данные между двумя массивами объектов - PullRequest
1 голос
/ 19 октября 2019

У меня есть два массива объектов

Во-первых, один получен из базы данных

const data = [{
    count: 156,
    monthCount: 1,
    year: 2018
  },
  {
    count: 165,
    monthCount: 2,
    year: 2018
  },
  {
    count: 153,
    monthCount: 3,
    year: 2018
  },
  {
    count: 63,
    monthCount: 6,
    year: 2018
  },
  {
    count: 4,
    monthCount: 9,
    year: 2018
  },
  {
    count: 116,
    monthCount: 10,
    year: 2018
  }
]

А второй - мои фиктивные данные

const dummyData = [{
    count: 0,
    monthCount: 1,
    year: 2018
  },
  {
    count: 0,
    monthCount: 2,
    year: 2018
  },
  {
    count: 0,
    monthCount: 3,
    year: 2018
  },
  {
    count: 0,
    monthCount: 4,
    year: 2018
  },
  {
    count: 0,
    monthCount: 5,
    year: 2018
  },
  {
    count: 0,
    monthCount: 6,
    year: 2018
  },
  {
    count: 0,
    monthCount: 7,
    year: 2018
  },
  {
    count: 0,
    monthCount: 8,
    year: 2018
  },
  {
    count: 0,
    monthCount: 9,
    year: 2018
  },
  {
    count: 0,
    monthCount: 10,
    year: 2018
  },
  {
    count: 0,
    monthCount: 11,
    year: 2018
  },
  {
    count: 0,
    monthCount: 12,
    year: 2018
  }
]

Мне нужно добавитьпропущенные значения в моем массиве data по сравнению с месяцем массива dummy.

Я пытался использовать lodash, но не смог получить то, что мне нужно.

var diffArr =  _.differenceWith(obj.data, 'monthCount', numberArr, 'monthCount', _.isEqual)

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 19 октября 2019

Вы можете map свои элементы dummyData и заменить их, если соответствующий элемент существует для того же месяцаCount в массиве реальных данных:

const data = [{
    count: 156,
    monthCount: 1,
    year: 2018
  },
  {
    count: 165,
    monthCount: 2,
    year: 2018
  },
  {
    count: 153,
    monthCount: 3,
    year: 2018
  },
  {
    count: 63,
    monthCount: 6,
    year: 2018
  },
  {
    count: 4,
    monthCount: 9,
    year: 2018
  },
  {
    count: 116,
    monthCount: 10,
    year: 2018
  }
]

const dummyData = [{
    count: 0,
    monthCount: 1,
    year: 2018
  },
  {
    count: 0,
    monthCount: 2,
    year: 2018
  },
  {
    count: 0,
    monthCount: 3,
    year: 2018
  },
  {
    count: 0,
    monthCount: 4,
    year: 2018
  },
  {
    count: 0,
    monthCount: 5,
    year: 2018
  },
  {
    count: 0,
    monthCount: 6,
    year: 2018
  },
  {
    count: 0,
    monthCount: 7,
    year: 2018
  },
  {
    count: 0,
    monthCount: 8,
    year: 2018
  },
  {
    count: 0,
    monthCount: 9,
    year: 2018
  },
  {
    count: 0,
    monthCount: 10,
    year: 2018
  },
  {
    count: 0,
    monthCount: 11,
    year: 2018
  },
  {
    count: 0,
    monthCount: 12,
    year: 2018
  }
]

const allData = dummyData.map(dummyItem => (
  data.find(item => item.monthCount === dummyItem.monthCount) || dummyItem
))

console.log(allData);
0 голосов
/ 19 октября 2019

Наконец, я получил этот простой метод с использованием lodash: -

var diffArr = _.unionBy(data, dummyData, 'monthCount')
console.log(diffArr)
0 голосов
/ 19 октября 2019

Простой и простой способ сделать это - отобразить массив dummyData, проверить, существует ли объект в массиве данных из вашей базы данных.

Если он существует, мы возвращаем найденный объект, иначе мы возвращаемпустышка:)

const data=[{count:156,monthCount:1,year:2018},{count:165,monthCount:2,year:2018},{count:153,monthCount:3,year:2018},{count:63,monthCount:6,year:2018},{count:4,monthCount:9,year:2018},{count:116,monthCount:10,year:2018}];
const dummyData=[{count:0,monthCount:1,year:2018},{count:0,monthCount:2,year:2018},{count:0,monthCount:3,year:2018},{count:0,monthCount:4,year:2018},{count:0,monthCount:5,year:2018},{count:0,monthCount:6,year:2018},{count:0,monthCount:7,year:2018},{count:0,monthCount:8,year:2018},{count:0,monthCount:9,year:2018},{count:0,monthCount:10,year:2018},{count:0,monthCount:11,year:2018},{count:0,monthCount:12,year:2018}];

const myMergedData = dummyData.map(dummyDataItem=>{
    var found = false;
    for(var i = 0; i < data.length; i++) 
    {
        if(data[i].monthCount === dummyDataItem.monthCount)
        {
            found = data[i];
            break;
        }
    }
    
    //if already in original, return the original
    //else return the dummy one ;)
    if(found) return found; 
    else return dummyDataItem;
});

console.log('Your new array =>', myMergedData);
0 голосов
/ 19 октября 2019

Объединить объект с тем же ключом счета месяца.

Пожалуйста, проверьте это простое решение:

const data = [{
    count: 156,
    monthCount: 1,
    year: 2018
  },
  {
    count: 165,
    monthCount: 2,
    year: 2018
  },
  {
    count: 153,
    monthCount: 3,
    year: 2018
  },
  {
    count: 63,
    monthCount: 6,
    year: 2018
  },
  {
    count: 4,
    monthCount: 9,
    year: 2018
  },
  {
    count: 116,
    monthCount: 10,
    year: 2018
  }
]

const dummyData = [{
    count: 0,
    monthCount: 1,
    year: 2018
  },
  {
    count: 0,
    monthCount: 2,
    year: 2018
  },
  {
    count: 0,
    monthCount: 3,
    year: 2018
  },
  {
    count: 0,
    monthCount: 4,
    year: 2018
  },
  {
    count: 0,
    monthCount: 5,
    year: 2018
  },
  {
    count: 0,
    monthCount: 6,
    year: 2018
  },
  {
    count: 0,
    monthCount: 7,
    year: 2018
  },
  {
    count: 0,
    monthCount: 8,
    year: 2018
  },
  {
    count: 0,
    monthCount: 9,
    year: 2018
  },
  {
    count: 0,
    monthCount: 10,
    year: 2018
  },
  {
    count: 0,
    monthCount: 11,
    year: 2018
  },
  {
    count: 0,
    monthCount: 12,
    year: 2018
  }
]

const resultData = dummyData.map((d, index)=>({...d, ...data.find(k=>k.monthCount===d.monthCount)}));
    console.log(resultData);

Спасибо

0 голосов
/ 19 октября 2019

Вы можете создать новый массив и проверить, существует ли фактический mont, или взять один фиктивный объект с настроенным monthCount.

var data = [{ count: 156, monthCount: 1, year: 2018 }, { count: 165, monthCount: 2, year: 2018 }, { count: 153, monthCount: 3, year: 2018 }, { count: 63, monthCount: 6, year: 2018 }, { count: 4, monthCount: 9, year: 2018 }, { count: 116, monthCount: 10, year: 2018 }],
    dummy = { count: 0, monthCount: 0, year: 2018 },
    result = Array.from(
        { length: 12 },
        (i => (_, j) => data[i] && data[i].monthCount === j + 1
            ? data[i++]
            : { ...dummy, monthCount: j + 1 }
        )(0)
    );

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