更改Javascript中对象的嵌套属性

时间:2020-06-22 19:57:04

标签: javascript ecmascript-6

具有这种形式的对象:

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

secondCsecondDsecondEsecondF在一个下拉列表中,因此用户可以单击其中之一,并且应用程序必须重新加载新数据

如果未将其指定为“中间”节点,是否可以获取该值? (在下拉菜单中,没有firstAfirstB

3 个答案:

答案 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;
});