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