#javascript #arrays
Вопрос:
У меня есть сложный массив объектов и свойств JS. Некоторые из них возвращают значение, но некоторые возвращают значение null, проблема в том, что когда я сопоставляю список, это вызывает ошибку всякий раз, когда есть нулевое значение.
Я не могу отфильтровать массив прямо сейчас, потому что я уже нахожусь в цикле и не должен создавать другой отфильтрованный массив. Каков был бы мой лучший подход? Я хочу, чтобы мой цикл возвращал массив.Group.name[0].текст, и если его там нет, просто верните значение null.
const x = [
{
"id": "1",
"Groups": [
{
"name": [
{
"language": "en-US",
"text": "REGULAR_TIME"
}
],
"isSystem": true
},
{
"name": [
{
"language": "en-US",
"text": "CHARGEABLE"
}
],
"isSystem": true
}
]
},
{
"id": "2",
"Groups": [
{
"name": [
{
"language": "en-US",
"text": "REGULAR_TIME"
}
],
"isSystem": true
},
{
"name": [
{
"language": "en-US",
"text": "CHARGEABLE"
}
],
"isSystem": true
}
]
}
]
x.map(y=>y.Groups.name[0].text)
console.log(x)
Ответ №1:
Groups
это тоже массив, поэтому вам нужно использовать индексы для доступа к его членам, например Groups[0]
. Однако неясно, название какого Groups
элемента вы хотите получить.
Вероятно, вы имели в виду x.map(y=>y.Groups[0].name[0].text)
Groups
быть массивом — это тоже объект. это Groups.name
ничего вам не даст, так как такого свойства нет.
let x = [
{
"id": "1",
"Groups": [
{
"isSystem": true
},
{
"name": [
{
"language": "en-US",
"text": "CHARGEABLE"
}
],
"isSystem": true
}
]
},
{
"id": "2",
"Groups": [
{
"name": [
{
"language": "en-US",
"text": "REGULAR_TIME"
}
],
"isSystem": true
},
{
"name": [
{
"language": "en-US",
"text": "CHARGEABLE"
}
],
"isSystem": true
}
]
}
];
console.log(x.map(y => y.Groups[0].name?.[0].text));
// or just filter the absent names out before the main routine.
console.log(x.filter(y => y.Groups[0].name).map(y => y.Groups[0].name?.[0].text));
Комментарии:
1. x.карта(y=>y.Группы[0].имя[0].текст Да, это точные данные, которые я пытаюсь получить, и у меня эта ошибка. Итак, как бы я получил доступ к элементам, когда Groups.name не доступен?
2. Я добавил пример, когда
name
его нет. Это дает просто неопределенный конечный результат, но вы можете реализовать любое значение с помощьюif
map
обратного вызова check in.3. @WildThing также я добавил предварительную фильтрацию, чтобы получить только элементы, в которых
name
присутствует свойство.
Ответ №2:
вот в чем проблема ! Groups
является ли массив таким :
let result = [];
for (i=0; i<x.length;i ){
for(j=0;j<x[i].Groups.length;j ){
result.push(x[i].Groups[j].name[0].text)
}
}
этот цикл возвращает результат, содержащий массив текста
или вы можете попробовать это :
x.forEach(el=>{
el.Groups.forEach(v=>{
result.push(v.name[0].text)
})
})