我尝试使用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'));
答案 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