Неге бұл нысан сипаты анықталмаған?

Төмендегі кодты қарастырыңыз. Бірінші console.log суретті дұрыс тіркейді және оның сипаттарын төмендегі суретте көре аласыз. Алайда, консольге оның қасиеттері болса, біреуін тіркеуге тырысқанда, undefined аламын!

console.log(that.data[0].cards); //works -- see image below
console.log(that.data[0].cards.E); //undefined
console.log(that.data[0].cards['E']); //undefined
console.log(that.data[0].cards.hasOwnProperty('E')); //false

var test = JSON.stringify(that.data[0]);
console.log(test);//{}

for( var key in that.data[0].cards ) {
    console.log('hello????') //doesn't appear in the console
}

console.log( Object.keys( that.data[0].cards ) ); //[]
console.log( that.data[0].cards.propertyIsEnumerable("E") ); //false
console.log( that.data[0].cards.__lookupGetter__( "E" ) ); //undefined

Консоль нәтижесі:

enter image description here

Мұнда не болып жатқанын кез келген ой. that.data [0] ішіндегі xml сипаты, сонымен қатар, оның ішінде сипаттарға ие болу керек - шын мәнінде, /code>.

FWIW, Мен Firebug-де бірдей нәрсені аламын (жоғарыда көрсетілген консольдік бейне Chrome).

11
JSON.stringify (бұл) сценарийді толық тоқтатудан басқа ештеңе істемейді. Қате немесе басқа ештеңені тастамайды, бірақ JSON.stringify (бұл) шақыруынан кейін ештеңе орындалмайды. JSON.stringify (that.data [0] .cards) нәтижелерін көрсету үшін менің сұрағымды жаңарттық, ол оны {} .
қосылды автор maxedison, көзі
Мен кескінді жаңарттым.
қосылды автор maxedison, көзі
Бұл жолы нысанның шынымен бос емес екеніне сенімдісіз бе? Сіз оны кеңейте алмадыңыз ...
қосылды автор pimvdb, көзі
Рахмет. Мен әлі де ойнай алмадым. jsfiddle.net сайтында жеңілдетілген, оқшауланған сынақ ісін бере аласыз ба?
қосылды автор pimvdb, көзі
Егер мінез-құлықты қайталамайтын болсақ, сізге көмектеспейді. Сіз JSON-ті бере аласыз ба?
қосылды автор aziz punjani, көзі
Сіз JSON.stringify нәтижесін (сол арқылы) бере аласыз ба?
қосылды автор FreeCandies, көзі

2 жауаптар

Мәселені шешіп алдым. Негізінде бұл нысан ( that.data [0] .cards ) барлық қажетті AJAX сұрауларынан кейін жұмыс істейтін a() функциясы арқылы жасалған қасиеттерге ие xml файлдары өңделді. a() егер success кері шақыру функциясында анықтау үшін есептегішті пайдаланып, сұрауларды синхронды түрде іске қосуға рұқсат беремін.

a() іске қосылғаннан кейін, b() функциясы that.data [i] .cards қызметінде орындалуы тиіс. Алайда, a() алдында a() , асинхронды сұрауларға тәуелді болғандықтан, b() іске қосылды. Осылайша, шешім a() қоңырау b() жасау үшін жай болды.

Осылайша, бұл менің тарапымның қарапайым қателігі болды. Бұл неге соншалықты шатасып кетсе, консольге that.data [0] .cards тіркеуі маған шын мәнінде cards нысаны қазірдің өзінде салынғанын көрсетті ол әлі жоқ. Осылайша, консоль дұрыс емес немесе кем дегенде түсініксіз ақпаратпен қамтамасыз етті.

Өткен түнде әркімнің көмегі үшін рақмет! Шамамен айналады :)

12
қосылды
басқа құпия шешілді :)
қосылды автор Esailija, көзі
Бүгінде мен бірдей проблемаға тап болдым. Рахмет.
қосылды автор rr-, көзі

Менің ойымша, нысанның кілттері басып шығарылмайтын таңбалары бар сияқты, мысалы:

var obj = {};
obj["E"+String.fromCharCode(15)] = new Array(15);

console.log(obj);

/*Object
E: Array[15]
__proto__: Object*/

console.log(obj.E)

//undefined

console.log( obj["E"+String.fromCharCode(15)] )

//[]

Өңдеу: объектінің кілттері үшін бұл жағдай бар ма?

var realKeys = [];

for( var key in obj ) {
realKeys.push( [].slice.call( key ).map( function(v){return v.charCodeAt(0);} ).join(" ") );
}

//["69 15"] (69 stands for the letter "E" and 15 was the unprintable character I added manually)

Edit2: Сіз жасай алмайтындықтан, басып шығарылмайтын таңбалардың бар-жоғын білудің басқа әдісін қолданамын:

Төмендегідей негізгі жолды көшіріңіз: (кез келген көрінбейтін таңбаларды таңдайсыз)

Содан кейін алмасу буферіңізді осылай тастаңыз (Қос тырнақшалар пайдаланылғаныңызды тексеріңіз):

7
қосылды
Бірдей нәтиже шығарады. Мен жасадым: console.log (that.data [0] .cards ['E' + String.fromCharCode (15)]) & zwnj;;
қосылды автор maxedison, көзі
JSON.stringify (this.data [0]) : {«session»: «01», «xml»: {}, «cards»: {}} . Шындық мынада, xml нысаны сонымен қатар оның ішінде cards нысанымен де аталатын сипаттарға ие болуы керек. Сондай-ақ, сіз ұсынған for циклінің нәтижелерін қосу үшін менің сұрағымды жаңарттым, бірақ ол тіпті іске қосылмайды.
қосылды автор maxedison, көзі
Мен нәтижені көрсету үшін менің лауазымымды жаңарттық. Мен бетке сілтей алмаймын, себебі жергілікті дамуды жасаймын. Бұл бағдарламамен кездестірген ең керемет нәрселердің бірі оңай ...
қосылды автор maxedison, көзі
Объект AJAX арқылы xml деректерін (jQuery арқылы) жүктеуді сұрайды динамикалық түрде жасалады. Барлық деректер жүктелгеннен кейін, ол талданады (jQuery арқылы қайтадан). Дәл осы кезде «болжамды» массивтер (cards.E, cards.N, card.X) құрылады. Мен сіздердің соңғы редакцияларыңызды таңертең көріңіз. Көмегіңе рахмет.
қосылды автор maxedison, көзі
@macedison: Ал @ Esailija себебінен себебін тексеріңіз, сондықтан JSON.stringify (that.data [0]) дәл нәтижесін көшіріп/қойыңыз
қосылды автор pimvdb, көзі
Өйткені, сіздің нысаныңыз String.fromCharCode (15) -тен өзге көрінбейтін таңба болуы мүмкін, бұл 3, 24 немесе 22 болуы мүмкін және т.б. :)
қосылды автор Esailija, көзі
console.log (Object.keys (бұл.data [0] .cards)) деп көріңіз. Егер бұл жұмыс істемесе console.log (it.data [0] .cards.propertyIsEnumerable («E»)); Егер бұл жұмыс істемесе console.log .data [0] .cards .__ lookupGetter __ («E»)); Егер бұл тек бетке сілтеме жасамаса: D
қосылды автор Esailija, көзі
Нысанды қалай құрып жатырсыз, ол қайдан пайда болады? Сіз оны таза бетке оқшаулап қойдыңыз ба?
қосылды автор Esailija, көзі