gpt4 book ai didi

javascript - 在嵌套对象中搜索键并删除它们

转载 作者:行者123 更新时间:2023-12-05 09:31:44 24 4
gpt4 key购买 nike

我需要从对象中删除某些键,前提是这些键包含在我的“deleteKeys”数组中。

我怎样才能以优化的方式实现这一点?

代码如下:

const data = {
"details": [{
"userId": "user01",
"documents": [{
"document": {
"id": "doc_pp_01",
"type": "pp",
"number": "222333444",
"personName": {
"first": "JAMES",
"middle": "JOHNIE",
"last": "SMITH"
},
"nationality": "AL",
"dateOfBirth": "1990-01-01",
"issuingCountry": "AL",
"expiryDate": "2025-01-01",
"gender": "MALE"
}
}]
}],
"criteria": {
"id:": "AB1234",
"fullName": "James Johnie Smith"
}
};
const deleteKeys = ["details", "fullName"];

function cleanData(data) {
for (let elem in data) {
if (deleteKeys.includes(elem)) {
delete data[elem];
}
}
return data;
}

console.log(cleanData(data));

预期输出:

{
"criteria": {
"id:": "AB1234"
}
};

我想知道我是否可以通过将对象字符串化来实现这一点,因为这将是一个更干净的解决方案。

function assignKey(data) {
const formattedData = JSON.stringify(data);
deleteKeys.forEach(function(elem) {
if (formattedData.includes(elem)) {
formattedData.replace(elem, '');
}
});
return JSON.parse(formattedData);
}

最佳答案

使用delete 的问题在于您实质上是在更改原始对象。如果您在不同位置使用相同的对象引用,这可能会导致问题。

JSON 方法将不起作用,因为生成的 JSON 字符串在删除部分字符串后无效。您可以完成这项工作,但更容易出错。

我总是喜欢让这种函数返回对象的新实例。

function removeKeys(obj, keys) {
if (Array.isArray(obj)) return obj.map(item => removeKeys(item, keys));

if (typeof obj === 'object' && obj !== null) {
return Object.keys(obj).reduce((previousValue, key) => {
return keys.includes(key) ? previousValue : { ...previousValue, [key]: removeKeys(obj[key], keys) };
}, {});
}

return obj;
}

也可以先浅拷贝对象,然后在新对象上使用delete,而不是使用reduce

function removeKeys(obj, keys) {
if (Array.isArray(obj)) return obj.map((item) => removeKeys(item, keys));

if (typeof obj === "object" && obj !== null) {
return Object.keys(obj).reduce((previousValue, key) => {
return keys.includes(key)
? previousValue
: { ...previousValue, [key]: removeKeys(obj[key], keys) };
}, {});
}

return obj;
}

const data = {
details: [
{
userId: "user01",
documents: [
{
document: {
id: "doc_pp_01",
type: "pp",
number: "222333444",
personName: {
first: "JAMES",
middle: "JOHNIE",
last: "SMITH"
},
nationality: "AL",
dateOfBirth: "1990-01-01",
issuingCountry: "AL",
expiryDate: "2025-01-01",
gender: "MALE"
}
}
]
}
],
criteria: {
"id:": "AB1234",
fullName: "James Johnie Smith"
}
};

console.log(
"Without `fullName` and `details`",
removeKeys(data, ["fullName", "details"])
);
console.log("Without `id:` and `gender`", removeKeys(data, ["id:", "gender"]));

关于javascript - 在嵌套对象中搜索键并删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68678126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com