如果 id 不存在于 javascript/ 节点 js 中,通过比较来自另一个 json 对象的 id 从一个 json 对象中删除 JSON 对象
delete the JSON object from one json object by comparing the id from another json object if id is not present in javascript/ node js
let data = getData();
let anotherObj = getAnotherObj();
let res = data.reduce((acc, curr) => {
if (!acc[curr.system.name]) {
acc[curr.system.name] = {};
}
let detailsObj = {};
Object.keys(curr.DataDetails).forEach(key => {
let values = curr.DataDetails[key];
// special handling to flatten single attribute objects
if (values.length === undefined || values.length === 0) {
let keys = Object.keys(values);
if (keys.length == 1 && typeof values[keys[0]] !== 'object') {
detailsObj[key] = values[keys[0]];
return;
}
}
// clone values to output
detailsObj[key] = !Array.isArray(values) ? Object.assign({}, values) : [...values];
// find and replace ids
let ids = jsonpath.query(detailsObj[key], '$..id');
ids.forEach((id, i) => {
if (id in anotherObj) {
if (Array.isArray(detailsObj[key]))
detailsObj[key].splice(i, 1, anotherObj[id]);
else
detailsObj[key] = anotherObj[id];
}
});
});
acc[curr.system.name][curr.system.id] = {
title: curr.system.id,
uid: curr.system.id,
url: `/${curr.system.name}/${curr.system.id}`,
...detailsObj,
};
return acc;
}, {});
document.body.insertAdjacentHTML('beforeend', `<pre>${JSON.stringify(res, undefined, 1)}</pre>`);
console.log(res);
function getData() {
return [{
system: {
id: "4gSSbjCFEorYXqrgDIP2FA",
type: "Entry",
name: "User"
},
DataDetails: {
shortOption: {
"en-us": "some value"
},
mediaFile: [{
sys: {
type: "Link",
link: "Asset",
id: "7kRzyt4PFo",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "2OspeCtNK0s",
},
},
],
mediaGalary: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "1aBOO8tu3lUsjtICuIbUM5",
type: "Entry",
name: "User"
},
DataDetails: {
short: {
"en-us": "details of shorts"
},
shortSlugOption: {
"hi-In": "options"
},
booleanField: {
kl: "true"
},
},
},
{
system: {
id: "2pOUGnI1oRD7nsrYs600HA",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: [{
sys: {
type: "Link",
link: "Entry",
id: "66rzYr2BpWL",
},
},
{
sys: {
type: "Link",
link: "Entry",
id: "1VTBHdLTdSW",
},
},
],
},
},
{
system: {
id: "66rzYr2BpWL1VTBHdLTdSW",
type: "Entry",
name: "new"
},
DataDetails: {
oneReference: {
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
multiReference: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "cIb5mqEBRWDD6hrNmFmFE",
type: "Entry",
name: "new"
},
DataDetails: {
testingNewValue: {
"hi-IN": "jksdsdo"
}
},
},
{
system: {
id: "7kRzyt4PFrX13gHcw3Z1Ko",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: {
"en-us": "kknksdo"
}
},
}
];
}
function getAnotherObj() {
return {
"h2cPiuU9jIz": {
status: true,
tag: [],
filename: "wallpapers-6.jpg",
is_dir: false,
parent_uid: null,
},
"2OspeCtNK0s": {
status: true,
tag: [],
filename: "mediaFile1.jpg",
is_dir: false,
parent_uid: null,
},
"66rzYr2BpWL": {
type: 'entry',
tag: [],
entry_details: "this is first entry ***",
is_secret: false,
},
"1VTBHdLTdSW": {
type: 'entry',
tag: [],
entry_details: "some other entry ***",
is_secret: true,
},
};
}
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.1.1/jsonpath.min.js"></script>
我试图将两个对象数据放在一个输出中,但是通过读取 link 即资产
但在多数组列表中,输出显示如我所愿,但问题是在比较 anotherObj 的输出时,如果存在带有该 Obj 的 Id,它会显示预期值,即数据资产被替换为另一个对象
但我想删除与 anotherObj 中存在的对象不匹配的值
例如:-
"mediaGalary": [
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "gHcw3Z1Ko"
}
},
{
/**id:c**/
"status": true,
"tag": [],
"filename": "wallpapers-6.jpg",
"is_dir": false,
"parent_uid": null
}
]
and
"mediaFile": [
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "7kRzyt4PFo"
}
},
{
"status": true,
"tag": [],
"filename": "mediaFile1.jpg",
"is_dir": false,
"parent_uid": null
}
]
这里看起来像这样“id”:“gHcw3Z1Ko”不在 anotherObj 中,所以我想删除所有具有该 id 的对象
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "7kRzyt4PFo"
}
}
and
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "7kRzyt4PFo"
}
因为这个 id 对象不存在所以我想删除它并且我希望我的预期输出是这样的它应该只删除在 anotherObj
中不存在的对象
"mediaGalary": [
{
/**id:c**/
"status": true,
"tag": [],
"filename": "wallpapers-6.jpg",
"is_dir": false,
"parent_uid": null
}
]
and
"mediaFile": [
{
"status": true,
"tag": [],
"filename": "mediaFile1.jpg",
"is_dir": false,
"parent_uid": null
}
]
在我们完成替换 data
中的项目后,保留在 属性 id
中的项目不会被替换,因此它们不在 anotherObj
.[=27 中=]
所以我们可以像这样找到并删除它们:
// find items with `id` proerty
let objs = jsonpath.nodes(acc, '$..[?(@.sys.id)]');
// delete the items
objs.forEach(function(node) {
let key = node.path.pop();
let parent = jsonpath.value(acc, jsonpath.stringify(node.path));
if (Array.isArray(parent))
parent.splice(key, 1);
else
delete parent[key];
}, this);
演示:
let data = getData();
let anotherObj = getAnotherObj();
let res = data.reduce((acc, curr) => {
if (!acc[curr.system.name]) {
acc[curr.system.name] = {};
}
let detailsObj = {};
Object.keys(curr.DataDetails).forEach(key => {
let values = curr.DataDetails[key];
// special handling to flatten single attribute objects
if (values.length === undefined || values.length === 0) {
let keys = Object.keys(values);
if (keys.length == 1 && typeof values[keys[0]] !== 'object') {
detailsObj[key] = values[keys[0]];
return;
}
}
// clone values to output
detailsObj[key] = !Array.isArray(values) ? Object.assign({}, values) : [...values];
// find and replace ids
let ids = jsonpath.query(detailsObj[key], '$..id');
ids.forEach((id, i) => {
if (id in anotherObj) {
if (Array.isArray(detailsObj[key]))
detailsObj[key].splice(i, 1, anotherObj[id]);
else
detailsObj[key] = anotherObj[id];
}
});
});
acc[curr.system.name][curr.system.id] = {
title: curr.system.id,
uid: curr.system.id,
url: `/${curr.system.name}/${curr.system.id}`,
...detailsObj,
};
// find items which were not replaced
let objs = jsonpath.nodes(acc, '$..[?(@.sys.id)]');
// delete the items
objs.forEach(function(node) {
let key = node.path.pop();
let parent = jsonpath.value(acc, jsonpath.stringify(node.path));
if (Array.isArray(parent))
parent.splice(key, 1);
else
delete parent[key];
}, this);
return acc;
}, {});
document.body.insertAdjacentHTML('beforeend', `<pre>${JSON.stringify(res, undefined, 1)}</pre>`);
console.log(res);
function getData() {
return [{
system: {
id: "4gSSbjCFEorYXqrgDIP2FA",
type: "Entry",
name: "User"
},
DataDetails: {
shortOption: {
"en-us": "some value"
},
mediaFile: [{
sys: {
type: "Link",
link: "Asset",
id: "7kRzyt4PFo",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "2OspeCtNK0s",
},
},
],
mediaGalary: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "1aBOO8tu3lUsjtICuIbUM5",
type: "Entry",
name: "User"
},
DataDetails: {
short: {
"en-us": "details of shorts"
},
shortSlugOption: {
"hi-In": "options"
},
booleanField: {
kl: "true"
},
},
},
{
system: {
id: "2pOUGnI1oRD7nsrYs600HA",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: [{
sys: {
type: "Link",
link: "Entry",
id: "66rzYr2BpWL",
},
},
{
sys: {
type: "Link",
link: "Entry",
id: "1VTBHdLTdSW",
},
},
],
},
},
{
system: {
id: "66rzYr2BpWL1VTBHdLTdSW",
type: "Entry",
name: "new"
},
DataDetails: {
oneReference: {
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
multiReference: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "cIb5mqEBRWDD6hrNmFmFE",
type: "Entry",
name: "new"
},
DataDetails: {
testingNewValue: {
"hi-IN": "jksdsdo"
}
},
},
{
system: {
id: "7kRzyt4PFrX13gHcw3Z1Ko",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: {
"en-us": "kknksdo"
}
},
}
];
}
function getAnotherObj() {
return {
"h2cPiuU9jIz": {
status: true,
tag: [],
filename: "wallpapers-6.jpg",
is_dir: false,
parent_uid: null,
},
"2OspeCtNK0s": {
status: true,
tag: [],
filename: "mediaFile1.jpg",
is_dir: false,
parent_uid: null,
},
"66rzYr2BpWL": {
type: 'entry',
tag: [],
entry_details: "this is first entry ***",
is_secret: false,
},
"1VTBHdLTdSW": {
type: 'entry',
tag: [],
entry_details: "some other entry ***",
is_secret: true,
},
};
}
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.1.1/jsonpath.min.js"></script>
let data = getData();
let anotherObj = getAnotherObj();
let res = data.reduce((acc, curr) => {
if (!acc[curr.system.name]) {
acc[curr.system.name] = {};
}
let detailsObj = {};
Object.keys(curr.DataDetails).forEach(key => {
let values = curr.DataDetails[key];
// special handling to flatten single attribute objects
if (values.length === undefined || values.length === 0) {
let keys = Object.keys(values);
if (keys.length == 1 && typeof values[keys[0]] !== 'object') {
detailsObj[key] = values[keys[0]];
return;
}
}
// clone values to output
detailsObj[key] = !Array.isArray(values) ? Object.assign({}, values) : [...values];
// find and replace ids
let ids = jsonpath.query(detailsObj[key], '$..id');
ids.forEach((id, i) => {
if (id in anotherObj) {
if (Array.isArray(detailsObj[key]))
detailsObj[key].splice(i, 1, anotherObj[id]);
else
detailsObj[key] = anotherObj[id];
}
});
});
acc[curr.system.name][curr.system.id] = {
title: curr.system.id,
uid: curr.system.id,
url: `/${curr.system.name}/${curr.system.id}`,
...detailsObj,
};
return acc;
}, {});
document.body.insertAdjacentHTML('beforeend', `<pre>${JSON.stringify(res, undefined, 1)}</pre>`);
console.log(res);
function getData() {
return [{
system: {
id: "4gSSbjCFEorYXqrgDIP2FA",
type: "Entry",
name: "User"
},
DataDetails: {
shortOption: {
"en-us": "some value"
},
mediaFile: [{
sys: {
type: "Link",
link: "Asset",
id: "7kRzyt4PFo",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "2OspeCtNK0s",
},
},
],
mediaGalary: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "1aBOO8tu3lUsjtICuIbUM5",
type: "Entry",
name: "User"
},
DataDetails: {
short: {
"en-us": "details of shorts"
},
shortSlugOption: {
"hi-In": "options"
},
booleanField: {
kl: "true"
},
},
},
{
system: {
id: "2pOUGnI1oRD7nsrYs600HA",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: [{
sys: {
type: "Link",
link: "Entry",
id: "66rzYr2BpWL",
},
},
{
sys: {
type: "Link",
link: "Entry",
id: "1VTBHdLTdSW",
},
},
],
},
},
{
system: {
id: "66rzYr2BpWL1VTBHdLTdSW",
type: "Entry",
name: "new"
},
DataDetails: {
oneReference: {
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
multiReference: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "cIb5mqEBRWDD6hrNmFmFE",
type: "Entry",
name: "new"
},
DataDetails: {
testingNewValue: {
"hi-IN": "jksdsdo"
}
},
},
{
system: {
id: "7kRzyt4PFrX13gHcw3Z1Ko",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: {
"en-us": "kknksdo"
}
},
}
];
}
function getAnotherObj() {
return {
"h2cPiuU9jIz": {
status: true,
tag: [],
filename: "wallpapers-6.jpg",
is_dir: false,
parent_uid: null,
},
"2OspeCtNK0s": {
status: true,
tag: [],
filename: "mediaFile1.jpg",
is_dir: false,
parent_uid: null,
},
"66rzYr2BpWL": {
type: 'entry',
tag: [],
entry_details: "this is first entry ***",
is_secret: false,
},
"1VTBHdLTdSW": {
type: 'entry',
tag: [],
entry_details: "some other entry ***",
is_secret: true,
},
};
}
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.1.1/jsonpath.min.js"></script>
我试图将两个对象数据放在一个输出中,但是通过读取 link 即资产
但在多数组列表中,输出显示如我所愿,但问题是在比较 anotherObj 的输出时,如果存在带有该 Obj 的 Id,它会显示预期值,即数据资产被替换为另一个对象
但我想删除与 anotherObj 中存在的对象不匹配的值
例如:-
"mediaGalary": [
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "gHcw3Z1Ko"
}
},
{
/**id:c**/
"status": true,
"tag": [],
"filename": "wallpapers-6.jpg",
"is_dir": false,
"parent_uid": null
}
]
and
"mediaFile": [
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "7kRzyt4PFo"
}
},
{
"status": true,
"tag": [],
"filename": "mediaFile1.jpg",
"is_dir": false,
"parent_uid": null
}
]
这里看起来像这样“id”:“gHcw3Z1Ko”不在 anotherObj 中,所以我想删除所有具有该 id 的对象
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "7kRzyt4PFo"
}
}
and
{
"sys": {
"type": "Link",
"link": "Asset",
"id": "7kRzyt4PFo"
}
因为这个 id 对象不存在所以我想删除它并且我希望我的预期输出是这样的它应该只删除在 anotherObj
中不存在的对象"mediaGalary": [
{
/**id:c**/
"status": true,
"tag": [],
"filename": "wallpapers-6.jpg",
"is_dir": false,
"parent_uid": null
}
]
and
"mediaFile": [
{
"status": true,
"tag": [],
"filename": "mediaFile1.jpg",
"is_dir": false,
"parent_uid": null
}
]
在我们完成替换 data
中的项目后,保留在 属性 id
中的项目不会被替换,因此它们不在 anotherObj
.[=27 中=]
所以我们可以像这样找到并删除它们:
// find items with `id` proerty
let objs = jsonpath.nodes(acc, '$..[?(@.sys.id)]');
// delete the items
objs.forEach(function(node) {
let key = node.path.pop();
let parent = jsonpath.value(acc, jsonpath.stringify(node.path));
if (Array.isArray(parent))
parent.splice(key, 1);
else
delete parent[key];
}, this);
演示:
let data = getData();
let anotherObj = getAnotherObj();
let res = data.reduce((acc, curr) => {
if (!acc[curr.system.name]) {
acc[curr.system.name] = {};
}
let detailsObj = {};
Object.keys(curr.DataDetails).forEach(key => {
let values = curr.DataDetails[key];
// special handling to flatten single attribute objects
if (values.length === undefined || values.length === 0) {
let keys = Object.keys(values);
if (keys.length == 1 && typeof values[keys[0]] !== 'object') {
detailsObj[key] = values[keys[0]];
return;
}
}
// clone values to output
detailsObj[key] = !Array.isArray(values) ? Object.assign({}, values) : [...values];
// find and replace ids
let ids = jsonpath.query(detailsObj[key], '$..id');
ids.forEach((id, i) => {
if (id in anotherObj) {
if (Array.isArray(detailsObj[key]))
detailsObj[key].splice(i, 1, anotherObj[id]);
else
detailsObj[key] = anotherObj[id];
}
});
});
acc[curr.system.name][curr.system.id] = {
title: curr.system.id,
uid: curr.system.id,
url: `/${curr.system.name}/${curr.system.id}`,
...detailsObj,
};
// find items which were not replaced
let objs = jsonpath.nodes(acc, '$..[?(@.sys.id)]');
// delete the items
objs.forEach(function(node) {
let key = node.path.pop();
let parent = jsonpath.value(acc, jsonpath.stringify(node.path));
if (Array.isArray(parent))
parent.splice(key, 1);
else
delete parent[key];
}, this);
return acc;
}, {});
document.body.insertAdjacentHTML('beforeend', `<pre>${JSON.stringify(res, undefined, 1)}</pre>`);
console.log(res);
function getData() {
return [{
system: {
id: "4gSSbjCFEorYXqrgDIP2FA",
type: "Entry",
name: "User"
},
DataDetails: {
shortOption: {
"en-us": "some value"
},
mediaFile: [{
sys: {
type: "Link",
link: "Asset",
id: "7kRzyt4PFo",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "2OspeCtNK0s",
},
},
],
mediaGalary: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "1aBOO8tu3lUsjtICuIbUM5",
type: "Entry",
name: "User"
},
DataDetails: {
short: {
"en-us": "details of shorts"
},
shortSlugOption: {
"hi-In": "options"
},
booleanField: {
kl: "true"
},
},
},
{
system: {
id: "2pOUGnI1oRD7nsrYs600HA",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: [{
sys: {
type: "Link",
link: "Entry",
id: "66rzYr2BpWL",
},
},
{
sys: {
type: "Link",
link: "Entry",
id: "1VTBHdLTdSW",
},
},
],
},
},
{
system: {
id: "66rzYr2BpWL1VTBHdLTdSW",
type: "Entry",
name: "new"
},
DataDetails: {
oneReference: {
sys: {
type: "Link",
linkType: "Asset",
id: "h2cPiuU9jIz",
},
},
multiReference: [{
sys: {
type: "Link",
link: "Asset",
id: "gHcw3Z1Ko",
},
},
{
sys: {
type: "Link",
link: "Asset",
id: "h2cPiuU9jIz",
},
},
],
},
},
{
system: {
id: "cIb5mqEBRWDD6hrNmFmFE",
type: "Entry",
name: "new"
},
DataDetails: {
testingNewValue: {
"hi-IN": "jksdsdo"
}
},
},
{
system: {
id: "7kRzyt4PFrX13gHcw3Z1Ko",
type: "Entry",
name: "Dummy"
},
DataDetails: {
testingNewValue: {
"en-us": "kknksdo"
}
},
}
];
}
function getAnotherObj() {
return {
"h2cPiuU9jIz": {
status: true,
tag: [],
filename: "wallpapers-6.jpg",
is_dir: false,
parent_uid: null,
},
"2OspeCtNK0s": {
status: true,
tag: [],
filename: "mediaFile1.jpg",
is_dir: false,
parent_uid: null,
},
"66rzYr2BpWL": {
type: 'entry',
tag: [],
entry_details: "this is first entry ***",
is_secret: false,
},
"1VTBHdLTdSW": {
type: 'entry',
tag: [],
entry_details: "some other entry ***",
is_secret: true,
},
};
}
<script src="https://cdn.jsdelivr.net/npm/jsonpath@1.1.1/jsonpath.min.js"></script>