Я преобразую XML-строку в JSON с помощью PHP, а затем отправляю ее в javascript файл, в котором я пытаюсь повторить его. Когда объект содержит более одного объекта, json содержит массив объектов, подобных первому примеру, и я могу выполнить итерацию с помощью функции .length, но когда объект содержит только 1 объект, массив не создается, а {{X1 }} Сбой функции. Как сделать так, чтобы итерация работала в обоих случаях, не зная имени объекта?

Образец 1:

{"class":[
   {
      "name":"history",
      "grade":"10"
   },
   {
      "name":"chemistry",
      "grade":"8"
   }
  ]
}

Образец 2:

{"class":
   {
      "name":"history",
      "grade":"10"
   }
}
0
Babis.amas 29 Авг 2017 в 16:09

4 ответа

Лучший ответ

Вы можете проверить length, и если это undefined, это означает, что это просто объект, тогда вы сделаете его массивом только с одним элементом:

if collection.length == undefined:
  collection = [collection]

# the rest of the code doesn't need to be changed
1
Danil Speransky 29 Авг 2017 в 13:19

Вы можете проверить, является ли объект первым массивом: Array.isArray(obj). Если это не так, то вы знаете, что вам не нужно повторять это.

var obj = {"class":[
   {
      "name":"history",
      "grade":"10"
   },
   {
      "name":"chemistry",
      "grade":"8"
   }
  ]
}

if (!Array.isArray(obj)) return obj;
// else iterate it.
1
AJ X. 29 Авг 2017 в 13:13

Вы должны знать тип данных переменной, прежде чем знать, как правильно использовать .length.

var dataTypeLength;
var data = {
 "class":
   {
     "name":"history",
     "grade":"10"
   }
}

if (Array.isArray(data.class)) {
  dataTypeLength = data.class.length;
} else {
  dataTypeLength = Object.keys(data.class).length;
}

console.log(dataTypeLength);
1
Josh 29 Авг 2017 в 13:17

Вы можете использовать for для этого, и вам не нужно length

var test = {"class":[
   {
      "name":"history",
      "grade":"10"
   },
   {
      "name":"chemistry",
      "grade":"8"
   }
  ]
}

for (var i in test){
    console.log(test[i]);
}
1
Edison Biba 29 Авг 2017 в 13:12