2017-01-05 9 views
-1

у меня есть JSON-файл вида:JavaScript Object свойство не определено, но там

{ 
    "results": { 
    "name1": { 
     "printouts": { 
      "property1": [{ 
        "someName": "someText", 
        "someName2": "someURL", 
        "someName3": integer, 
        "someName4": boolean 
       } 
      ], 
      "property2": [ 
       "someText" 
      ], 
      "property3": [ 
       "someText" 
      ], 
      "property4": [ 
       "someText" 
      ], 
      "property5": [ 
       "someText" 
      ], 
      "property6": [ 
       "someText" 
      ] 
     }, 
     "someName": "someText", 
     "someName2": "someURL", 
     "someName3": integer, 
     "someName4": boolean 
    }, 
    "name2": { 
     "printouts": { 
      "property1": [{ 
        "fulltext": "someText", 
        "fullurl": "someURL", 
        "namespace": integer, 
        "exists": boolean 
       } 
      ], 
      "property2": [ 
       "someText" 
      ], 
      "property3": [ 
       "someText" 
      ], 
      "property4": [ 
       "someText" 
      ], 
      "property5": [ 
       "someText" 
      ], 
      "property6": [ 
       "someText" 
      ] 
     }, 
     "someName": "someText", 
     "someName2": "someURL", 
     "someName3": integer, 
     "someName4": boolean 
    }, 
...... 
} 

Что я хочу, чтобы получить доступ к property6 каждого объекта в printouts. Что я сделал до сих пор:

for (i in results) { 
     if (someOtherArray.length < 1) { 
      someOtherArray.push(i.printouts.property6.toString()); 
     } 

Но это заставляет меня об ошибке: Не удается прочитать свойство property6 неопределенной. Что я делаю не так?

Любая идея? Благодарю.

+0

может быть ** i.name.printouts.property6.toString() ** – Curiousdev

+0

результаты должны быть массивом, а не объекта, из-за свойства двойного имени. –

+0

Похоже, у вас есть дополнительный '' 'там после' someText' ► '" property5 ": [someText"], ' – Nope

ответ

2

В основном у вас есть неправильный доступ к свойству с

i.printouts.property6 

он должен быть объект с property accessor с кронштейном для обозначения переменной.

data.results[i].printouts.property6 
//^^^^^^^^^^^^^ 

Затем вы можете перебирать ключи и выбирать требуемое свойство.

var data = { results: { name1: { printouts: { property1: [{ someName: "someText", someName2: "someURL", someName3: 33, someName4: false }], property2: ["someText"], property3: ["someText"], property4: ["someText"], property5: ["someText"], property6: ["someText"] }, someName: "someText", someName2: "someURL", someName3: 37, someName4: true }, name2: { printouts: { property1: [{ fulltext: "someText", fullurl: "someURL", namespace: 35, "exists": true }], property2: ["someText"], property3: ["someText"], property4: ["someText"], property5: ["someText"], property6: ["someText"] }, someName: "someText", someName2: "someURL", someName3: 34, someName4: false } } }; 
 

 
Object.keys(data.results).forEach(function (k) { 
 
    console.log(data.results[k].printouts.property6); 
 
});

-1

Ваш второй "name" заменит ваш первый name, так что вы должны изменить JSON к этому:

{ 
    "results": [ 
    {"name": { 
     "printouts": { 
      "property1": [{ 
        "someName": "someText", 
        "someName2": "someURL", 
        "someName3": integer, 
        "someName4": boolean 
       } 
      ], 
      "property2": [ 
       someText 
      ], 
      "property3": [ 
       someText 
      ], 
      "property4": [ 
       someText 
      ], 
      "property5": [ 
       someText" 
      ], 
      "property6": [ 
       "someText" 
      ] 
     }, 
     "someName": "someText", 
     "someName2": "someURL", 
     "someName3": integer, 
     "someName4": boolean 
    }, 
    }, "name": { 
     "printouts": { 
      "property1": [{ 
        "fulltext": "someText", 
        "fullurl": "someURL", 
        "namespace": integer, 
        "exists": boolean 
       } 
      ], 
      "property2": [ 
       someText 
      ], 
      "property3": [ 
       someText 
      ], 
      "property4": [ 
       someText 
      ], 
      "property5": [ 
       someText" 
      ], 
      "property6": [ 
       "someText" 
      ] 
     }, 
     "someName": "someText", 
     "someName2": "someURL", 
     "someName3": integer, 
     "someName4": boolean 
    }}, 
...... 
} 

Конечно, это относится только если у вас действительно есть "name" как свойство name для всех предметов. Если вы меняете JSON к рекомендуемому, то это, как вы должны делать вещи:

for (i in results) { 
     if (someOtherArray.length < 1) { 
      someOtherArray.push(results[i].name.printouts.property6.toString()); 
     } 
} 

Если оставить JSON без изменений, то это, как вам нужно перейти:

for (i in results) { 
     if (someOtherArray.length < 1) { 
      someOtherArray.push(results[i].printouts.property6.toString()); 
     } 
} 
+0

Интересно, почему мой ответ отклоняется. Прежде чем этот вопрос подвергается цензуре: мне интересно, потому что я хочу точно увидеть, где я ошибаюсь, или что я неправильно понял. –