具有这种形式的对象:
const myObj = {
'firstA': {
'secondC': [1,2,3],
'secondD': [4,5,6],
},
'firstB':{
'secondE': [0,0,0],
'secondF': [1,1,1],
},
}
我正在访问其子级数组之一,例如secondC
。
在这种情况下,应用程序使用appValue = myObj.firstA.secondC
。
值secondC
,secondD
,secondE
和secondF
在一个下拉列表中,因此用户可以单击其中之一,并且应用程序必须重新加载新数据
如果未将其指定为“中间”节点,是否可以获取该值? (在下拉菜单中,没有firstA
或firstB
)
答案 0 :(得分:0)
您还必须跟踪中间键,就像
{
"secondC":"fristA",
"secondD":"fristA",
}
然后,当用户从下拉菜单中选择时,您可以在映射中查找并知道中间键。您可以一次创建此映射并将其用作缓存,而不是每次都进行搜索。
以下是在子键和中键之间生成映射的代码:
const myObj = {
'firstA': {
'secondC': [1,2,3],
'secondD': [4,5,6],
},
'firstB':{
'secondE': [0,0,0],
'secondF': [1,1,1],
},
}
const mapping = Object.keys(myObj).reduce((acc,key)=>{
const subKeys = Object.keys(myObj[key]);
for(const subkey of subKeys){
acc[subkey] = key
}
return acc
},{})
console.log(mapping)
希望这会有所帮助!
答案 1 :(得分:0)
您可以使用Object.entries
之类的函数来迭代对象并找到所需的键:
const myObj = {
'firstA': {
'secondC': [1,2,3],
'secondD': [4,5,6],
},
'firstB':{
'secondE': [0,0,0],
'secondF': [1,1,1],
},
}
// Let's say the user selected "secondE"
let key = "secondE";
// Now find it:
let [mid, midValue] = Object.entries(myObj).find(([mid, midValue]) => key in midValue);
console.log(mid, key, midValue[key]);
答案 2 :(得分:0)
您可以将对象转换为平面对象,并改为使用它:
(terms in ('First Quarter', 'First Half') and months in ('JAN', 'FEB', 'MAR'))
or (terms in ('Second Quarter', 'First Half') and months in ('APR', 'MAY', 'JUN'))
const myObj = {
'firstA': {
'secondC': [1, 2, 3],
'secondD': [4, 5, 6],
},
'firstB': {
'secondE': [0, 0, 0],
'secondF': [1, 1, 1],
},
};
const $select = document.querySelector('select');
const $pre = document.querySelector('pre');
const options = Object.entries(myObj)
.reduce((res, [key, obj]) => ({...res, ...obj}), {});
Object.keys(options).forEach(key => {
const $option = document.createElement('option');
$option.value = key;
$option.innerText = key;
$select.appendChild($option);
});
$select.addEventListener('change', e => {
const key = e.target.value;
const value = key ? JSON.stringify(options[key]) : '';
$pre.innerHTML = value;
});