2016-07-13 3 views
0

배열이 객체 유형 인 경우 다음 재귀 함수가 중첩 배열을 출력하지 못하는 이유는 무엇입니까?객체를 반복 할 때 객체를 검사 할 때 배열을 검사 할 때

예상 출력과 실제 출력은 설명하기위한 것입니다.

// dummy encode function 
function encode(value) { 
    return value + " (this value was encoded!)" 
} 

var arr = { 
    "title1": { 
     "item1": "one", 
     "item2": "two" 
    }, 
    "title2": "three", 
    "title3": "four", 
    "title4": { 
     "item1": [{ 
      "arrayItem": "First array item" 
     }, { 
      "arrayItem": "Second array item" 
     }] 
    }, 
    "title5": { 
     "item1": { 
      "subItem1": "five", 
      "subItem2": "six" 
     } 
    } 
}; 

function encodeValues(arr) { 
    var keys = Object.keys(arr); 
    for (var i = 0; i < keys.length; i++) { 
     if (!!arr[keys[i]] && typeof arr[keys[i]] === "object") encodeValues(arr[keys[i]]); 

     else arr[keys[i]] = encode(arr[keys[i]]); 
    } 
    return arr; 
} 

var encodedValues = encodeValues(arr); 

console.log(encodedValues) 

예상 출력 :

{ 
    title1: { 
     item1: 'one (this value was encoded!)', 
     item2: 'two (this value was encoded!)' 
    }, 
    title2: 'three (this value was encoded!)', 
    title3: 'four (this value was encoded!)', 
    title4: { 
     item1: [{ 
      arrayItem: First array item(this value was encoded!) 
     }, { 
      arrayItem: Second array item(this value was encoded!) 
     }] 
    }, 
    title5: { 
     item1: { 
      subItem1: 'five (this value was encoded!)', 
      subItem2: 'six (this value was encoded!)' 
     } 
    } 
} 

실제 출력 :

{ 
    title1: { 
     item1: 'one (this value was encoded!)', 
     item2: 'two (this value was encoded!)' 
    }, 
    title2: 'three (this value was encoded!)', 
    title3: 'four (this value was encoded!)', 
    title4: { 
     item1: [ 
      [Object], 
      [Object] 
     ] 
    }, 
    title5: { 
     item1: { 
      subItem1: 'five (this value was encoded!)', 
      subItem2: 'six (this value was encoded!)' 
     } 
    } 
} 

이 솔루션은 if 문에서 배열의 예를 들면 다음을 확인하십시오 즉의 라인을 따라 어떤 것입니까? :

if (!!arr[keys[i]] && arr[keys[i]] instanceof Array) 
    encodeValues(arr[keys[i]]); 
else if (!!arr[keys[i]] && typeof arr[keys[i]] === "object") 
    encodeValues(arr[keys[i]]); 
else 
    arr[keys[i]] = encode(arr[keys[i]]); 

감사합니다.

답변

1

코드가 원하는대로 정확하게 수행되고 있다고 생각합니다. 그러나 예상 한 형식으로 로그인하지 않았을 것입니다.

시도하십시오 console.log(JSON.stringify(encodedValues, null, 2)); 중첩 된 개체를 볼 수 있도록. 출력을 포함하여 (들여 쓰기 꽤을 고정)

전체 코드 :

// dummy encode function 
function encode(value) { 
    return value + " (this value was encoded!)" 
} 

var arr = { 
    "title1": { 
    "item1": "one", 
    "item2": "two" 
    }, 
    "title2": "three", 
    "title3": "four", 
    "title4": { 
    "item1": [ 
     { 
     "arrayItem": "First array item" 
     }, 
     { 
     "arrayItem": "Second array item" 
     } 
    ] 
    }, 
    "title5": { 
    "item1": { 
     "subItem1": "five", 
     "subItem2": "six" 
    } 
    } 
}; 

function encodeValues(arr) { 
    var keys = Object.keys(arr); 
    for (var i = 0; i < keys.length; i++) { 
    if (!!arr[keys[i]] && typeof arr[keys[i]] === "object") { 
     encodeValues(arr[keys[i]]); 
    } else { 
     arr[keys[i]] = encode(arr[keys[i]]); 
    } 
    } 
    return arr; 
} 

var encodedValues = encodeValues(arr); 

console.log(JSON.stringify(encodedValues, null, 2)); 

// Output: 
// { 
// "title1": { 
//  "item1": "one (this value was encoded!)", 
//  "item2": "two (this value was encoded!)" 
// }, 
// "title2": "three (this value was encoded!)", 
// "title3": "four (this value was encoded!)", 
// "title4": { 
//  "item1": [ 
//  { 
//   "arrayItem": "First array item (this value was encoded!)" 
//  }, 
//  { 
//   "arrayItem": "Second array item (this value was encoded!)" 
//  } 
//  ] 
// }, 
// "title5": { 
//  "item1": { 
//  "subItem1": "five (this value was encoded!)", 
//  "subItem2": "six (this value was encoded!)" 
//  } 
// } 
// } 
+0

FIP. 그래 그거야. 나를 바르게 두게 해줘서 고마워! – fivedoor

관련 문제