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);