-2

我下面有一个这样的json

[
  {
    "monthlyData": [
      {
        "dateYear": "2020-07",
        "data": [
          {
            "id": "45bf4792-c5a5-44ed-b7e8-57557c4f30ee",
            "date": "2020-07-13T00:00:00.000Z",
            "transactionId": "160",
            "amount": 70,
            "active": 1,
            "createdAt": "2020-07-14T02:55:43.988Z",
            "updatedAt": "2020-08-14T02:55:43.988Z",
            "version": 1
          }
        ]
      }
    ],
    "hashId": "4"
  },
  {
    "monthlyData": [
      {
        "dateYear": "2020-08",
        "data": [
          {
            "id": "38fe3c68-e6aa-4c57-b4d7-dc6c4f597269",
            "date": "2020-08-13T00:00:00.000Z",
            "transactionId": "146",
            "active": 1,
            "createdAt": "2020-08-14T02:55:43.988Z",
            "updatedAt": "2020-08-14T02:55:43.988Z",
            "version": 1
          }
        ]
      }
    ],
    "hashId": "5"
  }
]

我有一个包含月份列表的数组

let datesArr = ['2020-08','2020-09','2020-10','2020-11','2020-07']

现在我想一个一个地选择一个日期,datesArr并查找该日期是否与dateYear整个 JSON 数组中的列匹配。应为匹配的日期创建 JSON 数组的副本。我只想保留那些日期匹配的对象。

4

2 回答 2

1

您可以使用array.filter

let originalArray = [
    {
        "monthlyData": [
            {
                "dateYear": "2020-07",
                "data": [
                    {
                        "id": "45bf4792-c5a5-44ed-b7e8-57557c4f30ee",
                        "date": "2020-07-13T00:00:00.000Z",
                        "transactionId": "160",
                        "amount": 70,
                        "active": 1,
                        "createdAt": "2020-07-14T02:55:43.988Z",
                        "updatedAt": "2020-08-14T02:55:43.988Z",
                        "version": 1
                    }
                ]
            }
        ],
        "hashId": "4"
    },
    {
        "monthlyData": [
            {
                "dateYear": "2020-08",
                "data": [
                    {
                        "id": "38fe3c68-e6aa-4c57-b4d7-dc6c4f597269",
                        "date": "2020-08-13T00:00:00.000Z",
                        "transactionId": "146",
                        "active": 1,
                        "createdAt": "2020-08-14T02:55:43.988Z",
                        "updatedAt": "2020-08-14T02:55:43.988Z",
                        "version": 1
                    }
                ]
            }
        ],
        "hashId": "5"
    }
];

let datesArr = ['2020-08','2020-09','2020-10','2020-11'];

let filtered = originalArray.filter(value => {
    value.monthlyData = value.monthlyData.filter(md => {
        return datesArr.includes(md.dateYear);
    })
    return value.monthlyData.length > 0;
})

console.log(JSON.stringify(filtered))

此示例将在下面打印(如果这是您想要的):

[
  {
    "monthlyData": [
      {
        "dateYear": "2020-08",
        "data": [
          {
            "id": "38fe3c68-e6aa-4c57-b4d7-dc6c4f597269",
            "date": "2020-08-13T00:00:00.000Z",
            "transactionId": "146",
            "active": 1,
            "createdAt": "2020-08-14T02:55:43.988Z",
            "updatedAt": "2020-08-14T02:55:43.988Z",
            "version": 1
          }
        ]
      }
    ],
    "hashId": "5"
  }
]

编辑日期对象比较

如果 datesArr 就像

let datesArr = [new Date('2020-08'),new Date('2020-09')];

您可以在第二个过滤器中使用array.some

let filtered = originalArray.filter(value => {
    value.monthlyData = value.monthlyData.filter(md => {
        return datesArr.some(value1 => value1.getTime() === new Date(md.dateYear).getTime());
    })
    return value.monthlyData.length > 0;
})

当然,如果原始数组也有 Date 对象,您可以 放弃new Date(md.dateYear).getTime()使用md.dateYear.getTime()

编辑您的评论

我需要将这些日期添加到与 datesArray 不匹配且数据为空的月份数据中。我应该怎么办。

您可以使用下面的代码

let newArr = []
datesArr.forEach(date => {
    let element = originalArray.find(value => {
        value.monthlyData = value.monthlyData.filter(md => {
            return date === md.dateYear;
        })
        return value.monthlyData.length > 0;
    })

    if (!element){
        element = {
            "monthlyData": [
                {
                    "dateYear": date,
                    "data": []
                }
            ],
            "hashId": "something?"
        }
    }else {
        // make a clone
        element = JSON.parse(JSON.stringify(element))
    }
    newArr.push(element);
})
于 2020-08-14T09:07:57.787 回答
1

您可以使用 Javascript 的 forEach 有效地做到这一点

下面的代码提取了您需要的信息。

const bigTable = [{
    "monthlyData": [{
      "dateYear": "2020-07",
      "data": [{
        "id": "45bf4792-c5a5-44ed-b7e8-57557c4f30ee",
        "date": "2020-07-13T00:00:00.000Z",
        "transactionId": "160",
        "amount": 70,
        "active": 1,
        "createdAt": "2020-07-14T02:55:43.988Z",
        "updatedAt": "2020-08-14T02:55:43.988Z",
        "version": 1
      }]
    }],
    "hashId": "4"
  },
  {
    "monthlyData": [{
      "dateYear": "2020-08",
      "data": [{
        "id": "38fe3c68-e6aa-4c57-b4d7-dc6c4f597269",
        "date": "2020-08-13T00:00:00.000Z",
        "transactionId": "146",
        "active": 1,
        "createdAt": "2020-08-14T02:55:43.988Z",
        "updatedAt": "2020-08-14T02:55:43.988Z",
        "version": 1
      }]
    }],
    "hashId": "5"
  }
]

const datesArr = ['2020-08', '2020-09', '2020-10', '2020-11', '2020-07']


console.log("Version 1: a separate object for each dateYear")
datesArr.forEach(dateYear => {
  console.log(dateYear+":-------------------");
  bigTable.forEach(monthlyArray => {
    monthlyArray.monthlyData.forEach(monthData => {
      if (dateYear === monthData.dateYear) {
        console.log(monthData)
      }
    })
  })
})


console.log("Version 2: a single array with an element for each element of datesArr")
const output = datesArr.map(dateYear => bigTable.filter(monthlyObject => 
    monthlyObject.monthlyData[0].dateYear=== dateYear
  )
)
console.log(output)

根据您希望它编译结果的确切方式,这从您的问题中并不明确,您应该能够根据您的需要对其进行调整。

如果没有您想要的输出示例,我们所能做的就是猜测您的意思。

于 2020-08-14T09:05:36.753 回答