使用JavaScript what';从对象中递归删除属性和值的最快方法是什么?
我需要找到从对象中删除所有使用JavaScript what';从对象中递归删除属性和值的最快方法是什么?,javascript,object,recursion,javascript-objects,Javascript,Object,Recursion,Javascript Objects,我需要找到从对象中删除所有$meta属性及其值的最快方法,例如: { "part_one": { "name": "My Name", "something": "123", "$meta": { "test": "test123" } }, "part_two": [ { "name": "name", "dob": "dob", "$meta": { "something":
$meta
属性及其值的最快方法,例如:
{
"part_one": {
"name": "My Name",
"something": "123",
"$meta": {
"test": "test123"
}
},
"part_two": [
{
"name": "name",
"dob": "dob",
"$meta": {
"something": "else",
"and": "more"
}
},
{
"name": "name",
"dob": "dob"
}
],
"$meta": {
"one": 1,
"two": 2
}
}
如果$meta
属性可以位于对象中的任何一点,那么可能需要某种形式的递归,那么应该变成以下内容
{
"part_one": {
"name": "My Name",
"something": "123"
},
"part_two": [
{
"name": "name",
"dob": "dob"
},
{
"name": "name",
"dob": "dob"
}
]
}
任何帮助或建议都将不胜感激
谢谢大家!
//Helper函数
功能移除道具(obj,按键){
if(阵列的obj实例){
目标forEach(功能(项目){
移除道具(物品、钥匙)
});
}
else if(对象的类型=='object'){
Object.getOwnPropertyNames(obj).forEach(函数(键){
如果(key.indexOf(key)!=-1)删除对象[key];
否则移除道具(obj[键],键);
});
}
}
//我们要迭代的对象
var obj={
“第一部分”:{
“姓名”:“我的姓名”,
“某物”:“123”,
“$meta”:{
“测试”:“test123”
}
},
“第二部分”:[
{
“名称”:“名称”,
“dob”:“dob”,
“$meta”:{
“某物”:“其他”,
“和”:“更多”
}
},
{
“名称”:“名称”,
“dob”:“dob”
}
],
“$meta”:{
"一":一,,
“两个”:2
}
};
//利用效用
移除props(obj,['$meta']);
//显示结果
document.body.innerHTML=''+JSON.stringify(obj,null,4)+''代码>一个简单的自调用函数可以做到这一点
function removeMeta(obj) {
for(prop in obj) {
if (prop === '$meta')
delete obj[prop];
else if (typeof obj[prop] === 'object')
removeMeta(obj[prop]);
}
}
// removes all propsToRemove (passed as an array or string), drilling down up to maxLevel times
// will modify the input and return it
du.removeAllPropsFromObj = function(obj, propsToRemove, maxLevel) {
if (typeof maxLevel !== "number") maxLevel = 10
for (var prop in obj) {
if (typeof propsToRemove === "string" && prop === propsToRemove)
delete obj[prop];
else if (propsToRemove.indexOf(prop) >= 0) // it must be an array
delete obj[prop];
else if (typeof obj[prop] === "object" && maxLevel>0)
du.removeAllPropsFromObj(obj[prop], propsToRemove, maxLevel-1);
}
return obj
}
var myObj={
“第一部分”:{
“姓名”:“我的姓名”,
“某物”:“123”,
“$meta”:{
“测试”:“test123”
}
},
“第二部分”:[
{
“名称”:“名称”,
“dob”:“dob”,
“$meta”:{
“某物”:“其他”,
“和”:“更多”
}
},
{
“名称”:“名称”,
“dob”:“dob”
}
],
“$meta”:{
"一":一,,
“两个”:2
}
}
函数removeMeta(obj){
用于(obj中的道具){
如果(prop=='$meta')
删除obj[prop];
else if(对象的类型[prop]=“对象”)
removeMeta(obj[prop]);
}
}
removeMeta(myObj);
console.log(myObj)代码>如上@floor所述:
JSON.parse(JSON.stringify(obj,(k,v)=>(k==='$meta')?未定义:v))
(抱歉,我还没有足够的信誉点直接发表评论。)
仅供参考,typeof null==='object',因此在@joseph marikle提供的removeMeta()示例中,函数将在null值上递归
请阅读此处的更多内容:这里有一个函数,可以递归删除字符串或字符串数组(基于Joseph的回答):
当对象中的任何键处于任何级别时,我使用@Joseph Marikle的引用函数创建了此函数
const _obj = {
a: "b", b: "e", c: { a: "a", b: "b", c: "c"},
d: [ { a: "3" }, { b: ["2", "3"] }]};
console.log(removeAttrDeep(_obj, "b"));
例如:
// recursively delete a key from anywhere in the object
// will mutate the obj - no need to return it
const deletePropFromObj = (obj, deleteThisKey) => {
if (Array.isArray(obj)) {
obj.forEach(element => deletePropFromObj(element, deleteThisKey))
} else if (typeof obj === 'object') {
for (const key in obj) {
const value = obj[key]
if (key === deleteThisKey) delete obj[key]
else deletePropFromObj(value, deleteThisKey)
}
}
}
deletePropFromObj(obj, '$meta');
不要使用递归,而是复制对象,忽略不需要的属性和值。关于javascript中递归的一个一般注意事项:它取决于浏览器内存分配,内存分配不太重要,因此递归占用大量资源,除非实现仔细的内存管理,否则无法用于大型数据集。最快的方法是先自己实现,然后寻求有关加快速度的帮助。您可以使用for in循环或更确切地说for of-->遍历对象属性和值,直到JS进行尾部递归优化。这对大型对象不安全。对于具有循环引用的对象来说,这也是不安全的。它工作得很好,如果需要保留原始对象,请确保克隆该对象。我看它对我不起作用。如果这是一个对象,则只取第一个属性。其他的呢?它不会返回整个对象并删除特定的道具。或者我遗漏了什么?相反,提供替换项作为stringify调用的参数,从而避免将这些属性序列化为string,首先警告此方法将从对象中删除不可序列化的内容,如函数或DOM元素,例如,在任何级别的纯js中实现这一点的智能方法,谢谢!
// recursively delete a key from anywhere in the object
// will mutate the obj - no need to return it
const deletePropFromObj = (obj, deleteThisKey) => {
if (Array.isArray(obj)) {
obj.forEach(element => deletePropFromObj(element, deleteThisKey))
} else if (typeof obj === 'object') {
for (const key in obj) {
const value = obj[key]
if (key === deleteThisKey) delete obj[key]
else deletePropFromObj(value, deleteThisKey)
}
}
}
deletePropFromObj(obj, '$meta');