如何更新具有特定条件的JSON对象



我有两个JSON文件,第一个是origin.json,第二个是newData.json

我想在NewData的基础上更新Origin的子值,但更新必须只影响newData.jsonuserAgents中存在的项。

以下代码展示了我需要转换的数据:

var originData = {
"userAgents": [
"Chrome",
"Safari"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": [
{
"userAgent": "Chrome"
},
{
"userAgent": "Safari"
}
]
}
]
};
var newData = {
"userAgents": [
"Chrome"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": []
}
]
};
originData.tests.forEach(function (originItem) {
newData.tests.forEach(function (newItem) {
if (newItem.name === originItem.name) {
originItem.errs = newItem.errs
}
})

});

console.log(originData);

在这种情况下,结果是:

{
"userAgents": [
"Chrome",
"Safari"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": []
}
]
}

但是这个结果是错误的,正确的结果应该是这样的:

{
"userAgents": [
"Chrome",
"Safari"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": [
{
"userAgent": "Safari"
}
]
}
]
}

你知道如何使用Node.js来获得这个结果吗?

使用以下代码:

const originData = {
"userAgents": [
"Chrome",
"Safari"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": [
{
"userAgent": "Chrome"
},
{
"userAgent": "Safari"
}
]
}
]
};
const newData = {
"userAgents": [
"Chrome"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": [
{
"userAgent": "Safari"
}
]
}
]
};
originData.tests.forEach(originItem => {
const newEl = newData.tests.find(ne => ne.name === originItem.name);
originItem.errs = originItem.errs.filter(e => newData.userAgents.includes(e.userAgent) || (newEl && -1 !== newEl.errs.findIndex(nee => nee.userAgent === e.userAgent)));
});
console.log(originData);

您可以使用一些外部模块吗?例如,使用lodash模块是可能的https://lodash.com/docs/4.17.10#merge

(顺便说一句:npm中有很多类似的库https://www.npmjs.com/search?q=deep%20merge)

var originData = {
"userAgents": [
"Chrome",
"Safari"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": [
{
"userAgent": "Chrome"
},
{
"userAgent": "Safari"
}
]
}
]
};
var newData = {
"userAgents": [
"Chrome"
],
"tests": [
{
"name": "a",
"errs": []
},
{
"name": "b",
"errs": [
{"userAgent": "Chrome"}
]
}
]
};
originData.tests.forEach(originItem => {
originItem.errs = originItem.errs.filter(e => (newData.userAgents.indexOf(e.userAgent) < 0 ));
});
newData.tests.forEach( newDataItem => {
let originDataItem = originData.tests.filter(obj=>obj.name===newDataItem.name)
newDataItem.errs.forEach( err => {
originDataItem[0].errs.push( err )
})
})
console.log(originData);

最新更新