在javascript中查找并删除数组中的嵌套元素?

在javascript中查找并删除数组中的嵌套元素?,javascript,node.js,arrays,lodash,Javascript,Node.js,Arrays,Lodash,我下面有一个类似这样的json [ { "monthlyData": [ { "dateYear": "2020-07", "data": [ { "id": "45bf4792-c5a5-44ed-b7e8-57557c4f30ee", "da

我下面有一个类似这样的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
中逐个选择一个日期,并查找该日期是否与整个JSON数组中的
dateYear
列匹配。应该为匹配的日期创建JSON数组的副本。我只想保留那些日期匹配的对象。

使用Javascript的forEach可以有效地实现这一点 下面的代码提取您需要的信息

const bigTable=[{
“月数据”:[{
“日期年”:“2020-07”,
“数据”:[{
“id”:“45bf4792-c5a5-44ed-b7e8-57557c4f30ee”,
“日期”:“2020-07-13T00:00:00.000Z”,
“transactionId”:“160”,
“金额”:70,
“主动”:1,
“createdAt”:“2020-07-14T02:55:43.988Z”,
“更新日期”:“2020-08-14T02:55:43.988Z”,
“版本”:1
}]
}],
“hashId”:“4”
},
{
“月数据”:[{
“日期年”:“2020-08”,
“数据”:[{
“id”:“38fe3c68-e6aa-4c57-b4d7-dc6c4f597269”,
“日期”:“2020-08-13T00:00:00.000Z”,
“transactionId”:“146”,
“主动”:1,
“createdAt”:“2020-08-14T02:55:43.988Z”,
“更新日期”:“2020-08-14T02:55:43.988Z”,
“版本”:1
}]
}],
“hashId”:“5”
}
]
const datesArr=['2020-08','2020-09','2020-10','2020-11','2020-07']
log(“版本1:每个dateYear都有一个单独的对象”)
datesArr.forEach(dateYear=>{
console.log(dateYear+“:-------------------------------”;
bigTable.forEach(monthlyArray=>{
monthlyArray.monthlyData.forEach(monthData=>{
如果(dateYear==monthData.dateYear){
console.log(monthData)
}
})
})
})
log(“版本2:每个datesArr元素都有一个元素的单个数组”)
const output=datesArr.map(dateYear=>bigTable.filter(monthlyObject=>
monthlyObject.monthlyData[0]。dateYear==dateYear
)
)

console.log(输出)
您可以使用数组.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))
此示例将在下面打印此内容(如果这是您想要的):

编辑日期对象比较

如果datesArr像

let datesArr = [new Date('2020-08'),new Date('2020-09')];
您可以在第二个过滤器中使用数组

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对象,那个么您可以放弃它
新日期(md.dateYear).getTime()
改用
md.dateYear.getTime()

编辑您的评论


我需要将那些日期添加到monthData中,但这些日期与 数据为空的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);
})

预期的输出是什么?如果使用日期str的includes,则改为。如果我想使用日期对象比较日期,需要更改什么我根据“查看编辑”部分编辑了我的答案我需要将那些日期添加到monthData中,这些日期与日期不匹配,数据为空。我该怎么办。如果你说的不清楚,请举例说明。是否要使用空数据在原始数组中保留日期?或者您想添加datesArr中的日期而不是原始数组中的日期?当前逻辑正常,但应将datesArr中但不是原始数组中的日期添加到原始数组中的键“dateYear”上,并且数据应为空。我需要将那些日期添加到monthData中,这些日期与datesArray不匹配,且数据为空。我该怎么做>嗯。。。我想你很难表达你到底想要什么。无论是你的问题,还是你在这里的澄清,还是你对另一个回答者的澄清,都不会让我更明智。如果您能给出所需输出的示例答案,那就更好了。否则,人们在猜测你的意思时会感到沮丧……例如,在你的问题中,你提到了“整个JSON数组中的dateYear列”。JSON数组没有dateYear列:dateYear属性属于数组的一个元素,该数组本身就是主JSON数组的元素。其次,“应该为匹配的日期创建JSON数组的副本。我只想保留那些日期匹配的对象。”这对我来说是非常模糊的。您想要JSON数组的一个副本,覆盖所有匹配的日期年吗?或者每个不同的dateYear都有一个JSON数组副本?第三,当您说“date”和“dateYear”时,请具体说明。您要求我们选择“日期”匹配的对象,但我们必须意识到,您指的不是“日期”字段,而是“日期年”字段。
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);
})