2016-07-13 2 views
0

Si un tableau est un type d'objet alors pourquoi la fonction récursive suivante ne parviennent pas à sortir le tableau imbriqué?Vérification d'un objet vs un tableau lorsque vous parcourez objet

La sortie attendue et la production réelle sont ci-dessous pour illustrer.

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

Sortie prévue:

{ 
    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!)' 
     } 
    } 
} 

sortie actuelle:

{ 
    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!)' 
     } 
    } 
} 

la solution serait quelque chose le long des lignes de ce qui suit ex.chèque par exemple d'un tableau dans l'instruction 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]]); 

grâce

Répondre

1

Je pense que votre code est en train de faire exactement ce que vous voulez, mais vous étaient tout simplement pas exploitation forestière dans le format que vous attendiez.

Essayez console.log(JSON.stringify(encodedValues, null, 2)); ainsi vous pouvez voir à l'intérieur des objets imbriqués.

code complet (fixe un peu d'indentation), y compris la sortie:

// 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. Oui c'est ça. merci beaucoup de me mettre bien! – fivedoor