#javascript #html
Вопрос:
Я не из JavaScript, но у меня есть небольшое требование, когда я работаю с JavaScript.
Я пытаюсь получить значения внутри объекта, который заключен в другой объект, я написал код, но я получаю ошибку. Ниже приведен мой код, я уверен, что допустил ошибку или, возможно, синтаксис неправильный, но не смог решить проблему.
Это копия кода с фиктивными значениями, может ли кто-нибудь, пожалуйста, помочь мне и указать, где я делаю неправильно.
const nameList = [
'XYZ',
'ABC',
'PQR'
];
var person = {
XYZ: {
name: 'XYZ',
age: 30
},
ABC: {
name: 'ABC',
age: 40
},
PQR: {
name: 'PQR',
age: 50
}
};
var rowCount = 0;
var releaseTableHTML = '';
releaseTableHTML ='<table><thead>Just Testing</thead><tbody><tr><th>Name</th><th>Age</th></tr>';
while (nameList.length > rowCount) {
releaseTableHTML ='<tr><td>' person.nameList[rowCount].name '</td><td>'
person.nameList[rowCount].age '</td></tr>';
rowCount ;
}
releaseTableHTML ='</tbody></table>';
Комментарии:
1. @Andy:
nameList
это массив…2. Вам необходимо использовать обозначения в скобках вокруг вашего динамического свойства
person.[nameList[rowCount]].name
3. пробовать
person[nameList[rowCount]].age
4. @Andy Cerbrus указывал, что ваша рекомендация пытается
nameList
получить прямой доступ, а не элемент изnameList
. Объекты не могут использовать массивы в качестве идентификаторов свойств.5. @Andy: Вы говорите, что значение массива является допустимой переменной для использования в скобках. Ты говоришь
person[['XYZ','ABC','PQR']]
, что это то, что нужно операции… Вы, наверное, имели в видуperson[nameList[someIndex]]
.
Ответ №1:
ничего сложного, вы не используете синтаксис для передачи данных внутри объекта правильно, вам нужно использовать такие вещи:
const obj = {
obj1: {
a: 1
}
};
console.log(obj["obj1"]?.a);
это пример, и вот как это сделать в вашем случае в строке 30
releaseTableHTML ='<tr><td>' person[nameList[rowCount]]?.name '</td><td>'
дело в том, что вы можете получить доступ к атрибуту внутри объекта с помощью [] и строки внутри, и здесь ваша строка является результатом массива с этим синтаксисом arr [], поэтому вы хотите что-то вроде этого — > obj[arr[]]
Ответ №2:
В нем нет никакой nameList
собственности person
. Просто используйте person[nameList[rowCount]].name
вместо person.nameList[rowCount].name
.
Обратите внимание, что это nameList[rowCount]
дает вам ключ человека, и вы можете использовать его в person
объекте.
const nameList = [
'XYZ',
'ABC',
'PQR'
];
var person = {
XYZ: {
name: 'XYZ',
age: 30
},
ABC: {
name: 'ABC',
age: 40
},
PQR: {
name: 'PQR',
age: 50
}
};
var rowCount = 0;
var releaseTableHTML = '';
releaseTableHTML = '<table><thead>Just Testing</thead><tbody><tr><th>Name</th><th> Age</th ></tr > ';
while (nameList.length > rowCount) {
releaseTableHTML = '<tr><td>' person[nameList[rowCount]]?.name '</td><td>'
person[nameList[rowCount]]?.age '</td></tr>';
rowCount ;
}
releaseTableHTML = '</tbody></table>';
document.body.innerHTML = (releaseTableHTML);
Ответ №3:
nameList
не является свойством person
, поэтому вам нужно использовать значение этого элемента массива в качестве ключа свойства, чтобы вы могли получить доступ к значению.
Я немного скорректировал ваш код, чтобы выбросить rowCount
переменную и просто использовать простую for...loop
.
const nameList=["XYZ","ABC","PQR"];
const person={XYZ:{name:"XYZ",age:30},ABC:{name:"ABC",age:40},PQR:{name:"PQR",age:50}};
let releaseTableHTML = '';
releaseTableHTML = '<table><thead>Just Testing</thead><tbody><tr><th>Name</th><th> Age </th></tr> ';
for (let i = 0; i < nameList.length; i ) {
releaseTableHTML = `
<tr>
<td>${person[nameList[i]].name}</td>
<td>${person[nameList[i]].age}</td>
</tr>`;
}
releaseTableHTML = '</tbody></table>';
document.querySelector('div').innerHTML = releaseTableHTML;
<div></div>
Ответ №4:
Я просто стараюсь, чтобы в вашем посте было меньше изменений. Таким образом, вы можете отобразить столбцы.
window.onload = function(){
const nameList = [
'XYZ',
'ABC',
'PQR'
];
var person = {
XYZ: {
name: 'XYZ',
age: 30
},
ABC: {
name: 'ABC',
age: 40
},
PQR: {
name: 'PQR',
age: 50
}
};
var rowCount = 0;
var releaseTableHTML = '';
releaseTableHTML ='<table><thead>Just Testing</thead><tbody><tr><th>Name</th><th>Age</th></tr>';
while (nameList.length > rowCount) {
releaseTableHTML ='<tr><td>' nameList[rowCount] '</td><td>'
person[nameList[rowCount]]['age'] '</td></tr>';
rowCount ;
}
releaseTableHTML ='</tbody></table>';
document.getElementById("test").innerHTML = releaseTableHTML;
}
<div id="test"><div>