Как я могу проверить, содержит ли объект определенный ключ?

Это мой объект data:

[{id:1, name:"Cat", category:{id:2, name:"Animals"}}]

Я хочу проверить, содержит ли он ключ category.

Это мой подход:

if (data.hasOwnProperty("category")) {
console.info("data contains category");
}else {
  console.info("data does not contain category");
}

Результат:

data does not contain category

Должно быть наоборот...

У вас есть массив, а не объект. Если у вас должен быть объект, вы должны смотреть на источник data.

Devon 25.02.2019 17:52

@Девон. Это должен быть объект, потому что если я alert(data.toString()); выведу: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

peace_love 25.02.2019 17:56

Он имеет [ ] вокруг объекта; это массив с одним объектом в нем.

Pointy 25.02.2019 17:56

@Ярла, это, наверное, не самый простой способ увидеть данные, использовать консоль, а не оповещения. Помимо этого, у вас есть массив из нескольких объектов, судя по всему, а не один объект. Я думаю, проблема в том, что вы ожидаете один объект, когда у вас есть массив объектов. Ошибается ли производитель или ожидания потребителя, решать вам.

Devon 25.02.2019 18:00

@Devon Спасибо, меня всегда смущает этот вопрос ... это объект или массив

peace_love 25.02.2019 18:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
63
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вам нужно повторить свой массив. Таким образом, вы можете поместить код внутри forEach

let k = [{
  id: 1,
  name: "Cat",
  category: {
    id: 2,
    name: "Animals"
  }
}]

k.forEach(function(data) {
  if (data.hasOwnProperty("category")) {
    console.info("data contains category");
  } else {
    console.info("data does not contain category");
  }
})

Если вы не предпочитаете итерацию, вам нужно передать индекс, поскольку данные представляют собой массив объектов.

let data = [{
  id: 1,
  name: "Cat",
  category: {
    id: 2,
    name: "Animals"
  }
}]


if (data[0].hasOwnProperty("category")) {
  console.info("data contains category");
} else {
  console.info("data does not contain category");
}

Вы также можете использовать some, чтобы проверить, соответствует ли какой-либо объект в вашем массиве определенному условию:

var data = [{
  id: 1,
  name: "Cat",
  category: {
    id: 2,
    name: "Animals"
  }
}];

var hasCategory = data.some(k => k.hasOwnProperty('category'));

if (hasCategory) {
  console.info("data contains category");
} else {
  console.info("data does not contain category");
}

Вам нужно перебирать элементы массива. и вы можете присвоение деструктуризации

let arr = [{id:1, name:"Cat", category:{id:2, name:"Animals"}}]

arr.forEach(({category})=>{
  if (category !== undefined) {
   console.info("data contains category");
  }else {
   console.info("data does not contain category");
  }
})

Просто примечание: если category определен как null, 0 или любое другое ложное значение, ваш текущий код будет отображаться: данные не содержат категорию. Возможно, вы можете улучшить его, изменив условие проверки на category !== undefined.

Shidersz 25.02.2019 18:02

@CodeManiac Добро пожаловать. Я надеюсь, что ваш голос против будет отменен, я не хотел, чтобы вы проголосовали против, извините за это.

Shidersz 25.02.2019 18:14

@Shidersz, нет проблем, приятель :) голосование против меня не беспокоит. единственный мотив - обучение.

Code Maniac 25.02.2019 18:15

Это массив только с одним индексом, поэтому вы можете сделать это с помощью оператора in:

"category" in data[0] // That checks if the property "category" exists.

Если у вас более одного индекса, вы должны зациклить этот массив.

Оператор in также проверяет унаследованные свойства.

let data = [{id:1, name:"Cat", category:{id:2, name:"Animals"}}];
data.forEach((o, i) => console.info("Index:", i, " - Has category?:", "category" in o));

Другие вопросы по теме