Javascript 嵌套对象上的联接(';';)

Javascript 嵌套对象上的联接(';';),javascript,object,ecmascript-6,Javascript,Object,Ecmascript 6,我尝试将对象中的所有值连接到分号分隔,如果对象仅为一个级别,则效果良好: obj = { name: "one" additionalInfo: "hello" ... }; Object.values(obj).join(';') 结果:1;你好 但如果对象是嵌套的: obj = { name: "one" additionalInfo: { description: "hello", ... } };

我尝试将对象中的所有值连接到分号分隔,如果对象仅为一个级别,则效果良好:

obj = { 
    name: "one"
    additionalInfo: "hello"
    ...
};

Object.values(obj).join(';')
结果:1;你好

但如果对象是嵌套的:

obj = { 
    name: "one"
    additionalInfo: {
         description: "hello",
         ...
    }
};

Object.values(obj).join(';')
结果:1;[对象]

除name之外的其他值当然是[object]。我如何也加入2级值

我想要的结果是:

one;hello

您可以使用递归函数并通过以下方式循环所有属性:

var obj={
名称:“一”,
其他信息:{
描述:“你好”,
}
};
var-val=[];
函数getValue(obj){
for(obj中的var属性){
if(对象hasOwnProperty(财产)){
if(对象类型[属性]=“对象”){
getValue(对象[属性]);
}否则{
val.push(对象[属性]);
}
}
}
返回val.join(“;”);
}
var r=获取值(obj);

console.log(r)
您可以采用递归方法,方法是确保在连接对象整个级别的值之前转换任何嵌套对象:

函数joinObjectValues(obj,delimiter=“;”){
返回对象值(obj)
.map(val=>{
//递归地转换任何对象
if(typeof val==“对象”){
返回joinObjectValues(val,分隔符);
}
返回val;
})
.join(分隔符)
}
设objOneLevel={
姓名:“一”
};
设objTwoLevels={
名称:“一”,
其他信息:{
描述:“你好”,
}
};
设objThreeLevels={
名称:“一”,
其他信息:{
描述:“你好”,
其他:{
customField:“世界”
}
}
};
日志(joinObjectValues(ObjectElevel))
log(joinObjectValues(objTwoLevels))

log(joinObjectValues(objThreeLevel))
对于多个级别,您可以执行以下操作:

var obj={
名称:“一”,
其他信息:{
描述:“你好”,
是的:“世界”
}
};
函数联接(obj){
var-arr=[];
用于(输入obj){
对象[key]的类型==“object”?arr.push(对象值(obj[key]):arr.push(obj[key])
}
返回arr.join(“;”)
}
console.log(join(obj))
const obj={
名称:“一”,
其他信息:{
描述:'你好',
萨克里:['m','e','n','t','o'],
傅:{
酒吧:“蝙蝠”,
商业:{
提示:“托克”,
您好:{
世界:哟,
编号:5,
布尔:{
肯定的:是的,
否定:错,
函数:{
do:()=>console.log('hello')
}
}
}
}
}
}
}
常量stripObj=obj=>(
对象值(obj)
.reduce((上一个,当前)=>typeof curr=='object'?[…上一个,stripObj(当前)]:[…上一个,当前],])
.join(“;”)
)
常数res=stripObj(obj)

控制台日志(res)是否使用递归函数执行此操作

const obj={
名称:“一”,
其他信息:{
描述:“你好”,
}
};
常量mapped=flatObject(obj).flat().join(“;”)
console.log(映射)
//这是一个递归函数
函数flatObject(obj){
常量ret=[]
for(让val输入Object.values(obj)){
if(对象的类型.值(obj)[val]!=='string'){
ret.push(扁平对象(对象值(obj)[val]))
}否则{
ret.push(对象值(obj)[val])
}
}
回程网

}
要获得预期的结果,请使用下面的选项将对象更改为字符串,并使用}

  • 使用JSON将obj更改为字符串。stringify并用“”分割
  • 获取介于“”和“”之间的单词,”以及介于“”和“}”之间的结束语
  • 使用repalce删除不需要的字符
  • 工作代码示例,并添加了几个测试对象
    obj={
    名称:“一”,
    其他信息:{
    描述:“你好”,
    },
    测试:“abc”,
    祖父母:{
    家长:{
    孩子:“孩子”
    }
    }
    };
    函数concatObj(obj){
    让str=JSON.stringify(obj).split(“:”);
    返回str.map(v=>v.substr(0,v.indexOf(“,”)| | v.substr(0,v.indexOf(“}”))).filter(Boolean.join(“:”).replace(/“|}|{/g”))
    }
    console.log(concatObj(obj))
    使用递归-

    let objValues = [];
        function getObjValues(obj) {
            const objValuesArray = Object.values(obj);
            objValuesArray.forEach((objVal) => {
                if(typeof objVal === 'object') {
                    getObjValues(objVal);
                } else {
                     objValues.push(objVal);
                }
            });
          return objValues.join(';');
        }
    
      const obj = {
                name: "one",
                additionalInfo: "hello",
                newObject: {
                    newname: "two",
                    info: "news"
                }
            }; 
    
    const concatenatedValues = getObjValues(obj);
    console.log(concatenatedValues);
    

    如果嵌套属性是数组,或者通常不是基元,该怎么办?请给出一个预期结果的示例
    let objValues = [];
        function getObjValues(obj) {
            const objValuesArray = Object.values(obj);
            objValuesArray.forEach((objVal) => {
                if(typeof objVal === 'object') {
                    getObjValues(objVal);
                } else {
                     objValues.push(objVal);
                }
            });
          return objValues.join(';');
        }
    
      const obj = {
                name: "one",
                additionalInfo: "hello",
                newObject: {
                    newname: "two",
                    info: "news"
                }
            }; 
    
    const concatenatedValues = getObjValues(obj);
    console.log(concatenatedValues);