Javascript 删除嵌套对象中的所有键,不包括js中的一个键

Javascript 删除嵌套对象中的所有键,不包括js中的一个键,javascript,Javascript,我有一个JSON对象,如下所示: x = { "prop1": { "description": "prop1", "dataType": "string", "value" : "abc" }, "prop2": { "sub1": { "description": "sub1", "dataType": "integer", "val

我有一个JSON对象,如下所示:

x = {
    "prop1": {
        "description": "prop1",
        "dataType": "string",
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "description": "sub1",
            "dataType": "integer",
            "value" : 12
        },
        "sub2": {
            "description": "sub2",
            "dataType": "integer"
        }
    },
    "prop3": {
        "input": {
            "name": {
                "description": "input messages",
                "dataType": "boolean",
                "value": false
            }
        },
        "output": {
            "description": "output messages",
            "dataType": "boolean",
            "value": false
        }
    }
}
function findValue(obj, string, obj1) {
    if (obj.hasOwnProperty("value")) {
        obj1[string.substring(1)] = obj.value
        return
    }
    for (var key in obj) {
        findValue(obj[key], [string, key].join("."), obj1)
    }
}

console.log(x);
var x1 = {}
findValue(x, "", x1)
var y = {};

function assign(obj, keyPath, value) {
    const lastKeyIndex = keyPath.length - 1;
    for (var i = 0; i < lastKeyIndex; ++i) {
      const key = keyPath[i];
      if (!(key in obj)) {
          obj[key] = {}
      }
      obj = obj[key];
    }
    obj[keyPath[lastKeyIndex]] = { "value": value };
}

Object.keys(x1).forEach(key => {
    const keyPath = key.split('.');
    let value = x1[key];
    if (value != null) {
        this.assign(y, keyPath, value);
    }
});

console.log(y);
在上面的对象中,我想删除键(description,dataType),如果没有任何值,也要删除键。上述产品的预期产量如下所示

y = {
    "prop1": {
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "value" : 12
        }
    },
    "prop3": {
        "input": {
            "name": {
                "value": false
            }
        },
        "output": {
            "value": false
        }
    }
}
我目前的解决办法如下:

x = {
    "prop1": {
        "description": "prop1",
        "dataType": "string",
        "value" : "abc"
    },
    "prop2": {
        "sub1": {
            "description": "sub1",
            "dataType": "integer",
            "value" : 12
        },
        "sub2": {
            "description": "sub2",
            "dataType": "integer"
        }
    },
    "prop3": {
        "input": {
            "name": {
                "description": "input messages",
                "dataType": "boolean",
                "value": false
            }
        },
        "output": {
            "description": "output messages",
            "dataType": "boolean",
            "value": false
        }
    }
}
function findValue(obj, string, obj1) {
    if (obj.hasOwnProperty("value")) {
        obj1[string.substring(1)] = obj.value
        return
    }
    for (var key in obj) {
        findValue(obj[key], [string, key].join("."), obj1)
    }
}

console.log(x);
var x1 = {}
findValue(x, "", x1)
var y = {};

function assign(obj, keyPath, value) {
    const lastKeyIndex = keyPath.length - 1;
    for (var i = 0; i < lastKeyIndex; ++i) {
      const key = keyPath[i];
      if (!(key in obj)) {
          obj[key] = {}
      }
      obj = obj[key];
    }
    obj[keyPath[lastKeyIndex]] = { "value": value };
}

Object.keys(x1).forEach(key => {
    const keyPath = key.split('.');
    let value = x1[key];
    if (value != null) {
        this.assign(y, keyPath, value);
    }
});

console.log(y);
函数findValue(obj,字符串,obj1){
if(对象hasOwnProperty(“值”)){
obj1[字符串子字符串(1)]=obj.value
返回
}
for(obj中的var键){
findValue(obj[key],[string,key].join(“.”,obj1)
}
}
控制台日志(x);
变量x1={}
findValue(x,“,x1)
变量y={};
功能分配(对象、关键路径、值){
const lastKeyIndex=keyPath.length-1;
对于(变量i=0;i{
常量keyPath=key.split('.');
设值=x1[键];
if(值!=null){
分配(y、键路径、值);
}
});
控制台日志(y);
我用了很长的时间。我首先将对象转换为一种格式,其中每个键都是父键和子键的组合,然后将其转换为预期的格式


有什么方法可以让它更好吗?

您可以简单地使用以下递归代码:

const x={
“建议1”:{
“说明”:“prop1”,
“数据类型”:“字符串”,
“价值”:“abc”
},
“建议2”:{
“sub1”:{
“说明”:“sub1”,
“数据类型”:“整数”,
“价值”:12
},
“sub2”:{
“说明”:“sub2”,
“数据类型”:“整数”
}
},
“建议3”:{
“输入”:{
“姓名”:{
“说明”:“输入消息”,
“数据类型”:“布尔值”,
“值”:false
}
},
“产出”:{
“说明”:“输出消息”,
“数据类型”:“布尔值”,
“值”:false
}
}
};
const reduceObject=object=>{
const obj=JSON.parse(JSON.stringify(object));
if(obj.hasOwnProperty('description')){
删除对象描述;
}
if(obj.hasOwnProperty('dataType')){
删除obj.dataType;
}
用于(让项目进入obj){
如果(对象的类型[项目]=='对象')对象[项目]=还原对象(对象[项目]);
}
返回obj;
};

console.log(reduceObject(x))您可以简单地使用以下递归代码:

const x={
“建议1”:{
“说明”:“prop1”,
“数据类型”:“字符串”,
“价值”:“abc”
},
“建议2”:{
“sub1”:{
“说明”:“sub1”,
“数据类型”:“整数”,
“价值”:12
},
“sub2”:{
“说明”:“sub2”,
“数据类型”:“整数”
}
},
“建议3”:{
“输入”:{
“姓名”:{
“说明”:“输入消息”,
“数据类型”:“布尔值”,
“值”:false
}
},
“产出”:{
“说明”:“输出消息”,
“数据类型”:“布尔值”,
“值”:false
}
}
};
const reduceObject=object=>{
const obj=JSON.parse(JSON.stringify(object));
if(obj.hasOwnProperty('description')){
删除对象描述;
}
if(obj.hasOwnProperty('dataType')){
删除obj.dataType;
}
用于(让项目进入obj){
如果(对象的类型[项目]=='对象')对象[项目]=还原对象(对象[项目]);
}
返回obj;
};

console.log(reduceObject(x))我将编写一个通用的项目处理函数。如果该项是一个对象,则遍历其值并递归调用该函数,如果存在与键匹配的嵌套值,则返回一个新对象。如果没有与键匹配的嵌套值,则返回一个唯一值(可以是符号),指示调用者应从父对象中删除此值:

const removeThis=Symbol();
常量转换=项=>{
if(项目类型!='object'| |项目===null){
退货项目;
}
const newEntries=[];
for(对象项(项)的常量[键,值]){
if(key==keyToKeep)newEntries.push([key,val]);
else if(typeof val=='object'&&val!==null){
const possibleNewObj=变换(val);
如果(可能的话!==移除){
newEntries.push([key,possibleNewObj]);
}
}
}
返回newEntries.length
?Object.fromEntries(新条目)
:除去它;
};
常量对象={
“建议1”:{
“说明”:“prop1”,
“数据类型”:“字符串”,
“价值”:“abc”
},
“建议2”:{
“sub1”:{
“说明”:“sub1”,
“数据类型”:“整数”,
“价值”:12
},
“sub2”:{
“说明”:“sub2”,
“数据类型”:“整数”
}
},
“建议3”:{
“输入”:{
“姓名”:{
“说明”:“输入消息”,
“数据类型”:“布尔值”,
“值”:false
}
},
“产出”:{
“说明”:“输出消息”,
“数据类型”:“布尔值”,
“值”:false
}
}
};
const keyToKeep='value';

console.log(转换(obj))我将编写一个通用的项目处理函数。如果该项是一个对象,则遍历其值并递归调用该函数,如果存在与键匹配的嵌套值,则返回一个新对象。如果没有与键匹配的嵌套值,则返回一个唯一值(可以是符号),指示调用者应从父对象中删除此值:

const removeThis=Symbol();
常量转换=项=>{
if(项目类型!='object'| |项目===null){
退货项目;
}
康斯特纽伊酒店
// remove entries other than the selected key
removeKey(x, exceptionKey);
// remove empty objects
removeEmptyObject(x);
// the final result
console.log(x);