如何从Map对象获取嵌套值?

时间:2018-06-27 17:35:59

标签: javascript ecmascript-6

我尝试使用es6 Map对象,而不是使用对象文字语法访问对象中的嵌套值,该对象具有便捷的map.get()方法。我试图避免对普通的Javascript对象执行以下操作。

// access deeply nested values...
obj['k1'] &&
obj['k1']['k2'] &&
obj['k1']['k2']['k3']

我在构建地图时错了吗?仅map.get('k1')有效(无法获得嵌套的地图值,仅将k1:下的整个内容作为值给出)。

var obj = {'k1': {'k2': {'k3': 'Test Value'}}};
const map = new Map(Object.entries(obj));

console.log(map.get('k1')); 
console.log(map.get('k2')); 
console.log(map.get('k3')); 

4 个答案:

答案 0 :(得分:1)

您还需要迭代所有键和嵌套对象。

function add(object, map) {
    Object.entries(object).forEach(([k, v]) => {
        map.set(k, v);
        if (v && typeof v === 'object') {
            add(v, map);
        }
    });
}

var obj = { k1: { k2: { k3: 'Test Value' } } };
const map = new Map;

add(obj, map);

console.log(map.get('k1')); 
console.log(map.get('k2')); 
console.log(map.get('k3')); 

答案 1 :(得分:1)

您有关使用Map查询嵌套对象的问题无效。地图无法做到这一点。您要么必须先将对象放平,然后再将其放入Map中,要么找到支持查询嵌套数据的另一种方法。

我不建议仅出于使用Map的目的而展平您的结构。您如何处理按键碰撞?它变得更加复杂。

因此,让我们看一下查询嵌套数据的一些方法:

// how to query a nested data structure.

const get = (prop, ...props) => obj =>
  obj == null || prop == null
    ? obj
    : get(...props)(obj[prop])

const obj = {'k1': {'k2': {'k3': 'Test Value'}}};
const result = get('k1', 'k2', 'k3')(obj) // => 'Test Value'

您还可以使用Ramda之类的库。

import path from 'ramda/src/path

const obj = {'k1': {'k2': {'k3': 'Test Value'}}};
const result = path(['k1', 'k2', 'k3'], obj)  // => 'Test Value'

答案 2 :(得分:0)

您可以尝试es6 destructuring 101。

let obj = {'k1': {'k2': {'k3': 'Test Value'}}};

let {k1} = obj;
let {k1: {k2}} = obj;
let {k1: {k2: {k3}}} = obj;

console.log(k1);
console.log(k2);
console.log(k3)

我希望这会有所帮助。

答案 3 :(得分:0)

我正在做类似的事情来立即创建图形/树。这不是我正在做的事情,但它应该可以给您这个想法。

在es5中,我会说

let root = {
  1:  {
       a: 'hi from a'
       b: ...
       }  
  2:  {...}
}

root[1][a]; //returns 'hi from a'
root['getme']['abeer']; //Type Error 

使用地图:

  let root = new Map();
  root.set(1, new Map());
  root.get(1).set('a', 'hi from a');

  root.get(1).get('a');  //returns 'hi from a'

  root.get(1).get('me a beer');  //undefined  

  root.get('me').get('a-beer'); 
  //Uncaught TypeError: Cannot read property 'get' of undefined