【问题标题】:How to push non exists data between two array of objects如何在两个对象数组之间推送不存在的数据
【发布时间】:2019-10-19 08:25:29
【问题描述】:

我有两个对象数组

首先从数据库中获取一个

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
  }
]

dummy 数组的月份相比,我需要在data 数组中添加缺失值。

我曾尝试使用 lodash,但无法得到我需要的东西。

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

提前谢谢你。

【问题讨论】:

  • 这里缺少什么数据?它是基于 monthCount 吗?

标签: javascript arrays loops lodash


【解决方案1】:

您可以map您的 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 allData = dummyData.map(dummyItem => (
  data.find(item => item.monthCount === dummyItem.monthCount) || dummyItem
))

console.log(allData);

【讨论】:

【解决方案2】:

您可以创建一个新数组并检查实际的 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; }

【讨论】:

    【解决方案3】:

    使用同月计数键合并对象。

    请查看这个简单的解决方案:

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

    谢谢

    【讨论】:

    • 我不认为索引是相同的。据我了解,dummyData 的目的更多是填补真实数据中的漏洞。
    • 明白你的意思。一开始我不了解monthCount的相关性。谢谢
    【解决方案4】:

    简单的方法是映射 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);

    【讨论】:

      【解决方案5】:

      最后,我用 lodash 得到了这个最简单的方法:-

      var diffArr = _.unionBy(data, dummyData, 'monthCount')
      console.log(diffArr)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-10
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 2018-10-28
        相关资源
        最近更新 更多