【问题标题】:Comparing one array to another and create a new array based on the differences将一个数组与另一个数组进行比较并根据差异创建一个新数组
【发布时间】:2021-07-15 21:45:02
【问题描述】:

我之前的问题是否因为遗漏了一个重要细节而结束。

假设我有以下两个数组

const salesDates = ['2021/06/30','2021/07/01','2021/07/02','2021/07/03','2021/07/04','2021/07/05','2021/07/06']

const jsonSalesData = [
         {date: '2021/07/01', company: 'ABC', sales: '32460'},
         {date: '2021/07/02', company: 'ABC', sales: '28165'},
         {date: '2021/07/03', company: 'ABC', sales: '31546'},
         {date: '2021/07/04', company: 'ABC', sales: '12654'},
         {date: '2021/07/05', company: 'ABC', sales: '26457'},
         {date: '2021/07/06', company: 'ABC', sales: '20351'},
         {date: '2021/07/07', company: 'ABC', sales: '56404'},
]

我需要做的是

  1. 如果jsonSalesData 中的datesalesDates 数组匹配,则从jsonSalesData 返回对象
  2. 如果salesDates 中的某个日期不在jsonSalesData 中,则将一个对象添加到jsonSalesDatadate,并将sales 设置为0

期望的输出

[
{date: '2021/06/30', company: 'ABC', sales: '0'},
{date: '2021/07/01', company: 'ABC', sales: '32460'},
{date: '2021/07/02', company: 'ABC', sales: '28165'},
{date: '2021/07/03', company: 'ABC', sales: '31546'},
{date: '2021/07/04', company: 'ABC', sales: '12654'},
{date: '2021/07/05', company: 'ABC', sales: '26457'},
{date: '2021/07/06', company: 'ABC', sales: '20351'},
]

注意第一个对象的添加和最后一个对象的排除

我尝试使用forEach,但它只完成了#1(返回jsonSalesData 中与salesDates 匹配的日期)。如果没有匹配,它不会添加对象。

const n = [];
jsonSalesData.forEach(e => {
    if (salesDates.includes(e.date)){ 
      n.push(e);
  }
})
console.log(n);

我也尝试过嵌套循环,但我似乎无法弄清楚。以下是我为这些人所做的:

    for (let i = 0; i < jsonSalesData.length; i++){
        for (let j = 0; j < salesData.length; j++){     
        if (jsonSalesData[i].date === salesData[j]){
console.log(jsonSalesData[i].company,jsonSalesData[i].date,jsonSalesData[i].sales)
        }
    
      }
    }

mapfilter 存在同样的问题——如果salesData 中的某些内容在jsonSalesData 中不存在,我似乎无法回头查看salesData 并将对象添加回jsonSalesData

【问题讨论】:

  • 您如何了解 6/30 的公司?
  • 因为salesDates 中有 2021/06/30 日期,但jsonSalesData 中没有 2021/06/30。因此,它被添加为 0 销售额。
  • salesDates.map(date => jsonSalesData.find(row=> row.date===date) || { date, sales: 0 });
  • 你怎么知道公司是 ABC for 6/30?
  • 向我们展示您的尝试,或者您遇到的问题。 SO 不是编码服务。您可以访问help center,并采取tour 看看什么和How to Ask

标签: javascript arrays json javascript-objects


【解决方案1】:

如果你不介意随意添加公司名称,你可以这样做

const salesDates = ['2021/06/30','2021/07/01','2021/07/02','2021/07/03','2021/07/04','2021/07/05','2021/07/06']
 
const jsonSalesData = [
         {date: '2021/07/01', company: 'ABC', sales: '32460'},
         {date: '2021/07/02', company: 'ABC', sales: '28165'},
         {date: '2021/07/03', company: 'ABC', sales: '31546'},
         {date: '2021/07/04', company: 'ABC', sales: '12654'},
         {date: '2021/07/05', company: 'ABC', sales: '26457'},
         {date: '2021/07/06', company: 'ABC', sales: '20351'},
         {date: '2021/07/07', company: 'ABC', sales: '56404'},
]

let updatedSalesData = salesDates.map(date => jsonSalesData.find(item=> item.date==date) || { date, company: 'ABC', sales: '0' }); 

console.log(updatedSalesData)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2018-08-04
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多