Проверьте, является ли javascript значение ключа объекта массивом или строкой? - PullRequest
1 голос
/ 01 мая 2020

У меня есть массив следующим образом.

Array
   (
    [13] => Array
    (
        "eventName" => Array
        (
            [0] => 'Event Name1'
            [1] => 'Event Name2'
        )
        "eventInfo" => Array
        (
            [0] => 'Event Information1'
            [1] => 'Event Information2'
        )       
    )
    [20] => Array
    (
        "eventName" => 'Event Name1'
        "eventInfo" => 'Event Information1'
    )
)

Я буду использовать эти данные для записи sh информации в календарь; первый уровень массива представляет дату. Я отправляю содержимое в виде строки json на javascript, а затем анализирую. Как только содержимое является объектом, как мне определить, является ли значение ключа «eventName» строкой или массивом. Так что у меня есть

var object = JSON.parse(data);
var objectSize = Object.keys(object).length;

for(var i = 0; i < objectSize; i++){
    var id = Object.keys(object)[i];
    if(Object.keys(object[id].eventName) != string){ //How do I fix this line?
        var arraySize = Object.keys(object[id].eventName).length;
        for(var r = 0; r < arraySize; r++){
            //update calendar cell
        }
    } else {
        //update calendar cell
    }
}

Как мне исправить эту строку?

if(Object.keys(object[id].eventName) != string){

Я попробовал это без удачи.

if(Array.isArray(Object.keys(object[id].eventName))){

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Array.isArray(Object.keys(object[id].eventName)) всегда будет возвращать true, поскольку:
Метод Object.keys () возвращает массив имен собственных перечисляемых свойств данного объекта

Вам необходимо проверить object [id] .eventName напрямую :

Array.isArray(object[id].eventName)

Я также хотел бы предложить изменить структуру данных, так как часть кода, кажется, повторяется в зависимости от независимо от того, является ли eventName строкой или массивом, вы всегда можете использовать последний, потому что нет ничего плохого в итерации по массиву, который содержит только один элемент.

Другим улучшением может быть итерация по Object.keys (объект) массив напрямую. Может быть сделано с помощью:

  1. функции forEach объекта массива
  2. регулярной для l oop
  3. for..of

let object = { foo: 'bar', x: 10 }

// forEach
Object.keys(object).forEach(key => console.log(key));

const keys = Object.keys(object); 
// for
for (let i = 0; i < keys.length; ++i) {
  console.log(keys[i])
}

// for...of 
for (let key of keys) {
  console.log(key);
}

Поскольку вы фактически перебираете объект / карту / словарь, стандартный способ сделать это в JS - это для ... в l oop.
Может потребоваться проверка hasOwnProperty (), если вы имеете дело с более сложными типами.

let object = { foo: 'bar', x: 10 }

for (let key in object) {
  console.log(key);
}
0 голосов
/ 01 мая 2020

Вы можете сделать:

const dataJs = [
  {
    "eventName": ['Event Name1', 'Event Name2'],
    "eventInfo": ["Event Information1", "Event Information2"],
  },
  {
    "eventName": "Event Name1",
    "eventInfo": "Event Information1",
  }
];


for(var i = 0; i < dataJs.length; i+=1){
    if(typeof dataJs[i].eventName !== 'string'){ //How do I fix this line?
        var arraySize = dataJs[i].eventName.length;
        for(var r = 0; r < arraySize; r++){
            //update calendar cell
        }
    } else {
        //update calendar cell
    }
    var contentSize = dataJs[i].eventName.length;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...