我有一个将一组 Javascript 对象转换为地图的函数。但是,我得到一个无法为其值导航的对象;这是示例 json
{
"products":{
"lemonade":{
"product-type":"beverage",
"product-details":{
"calories":"129",
"product-categories":[
222,
444
]
}
},
"limeade":{
"product-type":"beverage",
"product-details":{
"calories":"220",
"product-categories":[
222,
444
],
"salesIndex":{
"percentage":1101,
"demographics":"region-1"
}
}
}
}
}
这是我转换为地图的功能:
function objectToMap(o) {
const m = new Map();
console.log(`Processing for fragment ${fragment}`);
for (const k of Object.keys(o)) {
if (o[k] instanceof Object) {
console.log(`Key is ${k} and object is ${JSON.stringify(o[k])}`);
m.set(k, objectToMap(o[k]));
} else {
console.log(`Not an object ::Key is ${k} and object is
${JSON.stringify(o[k])}`);
m.set(k, o[k]);
}
}
return m;
}
以下是我尝试使用和打印地图的方法:
const m1 = objectToMap(obj.products);
printMap(m1);
function printMap(map) {
for (const k of map.keys()) {
console.log(`Current key is ${k} and value is
${map.get(k)}`);
if (map.get(k) instanceof Map) {
printMap(map.get(k));
} else {
console.log(`No it is not a map :: Key is ${k} and value is ${map.get(k)}`);
}
}
}
但是,我得到了一些这个键,salesIndex,[object Map],为什么没有打印键,值?
为什么没有打印键值?
它们被打印出来,但是原始值只有在对象被传递给递归调用时才会被打印出来(稍后),并且在那里else
执行块,即当您到达递归的基本情况时。
您的代码很好,但是当您还没有处于基本情况时,您应该避免打印该值,因为该值仍然需要传递给递归调用,这将负责打印更深层次的键/值。
我会建议:
objectToMap
,支持null
值:为此,您需要更改 is-object 测试。这是最重要的,但我也会:
objectToMap
中,使用Object.entries
而不是Object.keys
这样您就可以将键和值都作为循环变量printMap
,使用map.entries
而不是map.values
这样你得到键和值作为你的循环变量objectToMap
, 当你map.set()
在两种情况下调用时if
,else
从调用开始,并用条件(三元)运算符区分参数所以像这样:
// For the purpose of this answer, console.log removed from this function:
function objectToMap(o) {
const m = new Map();
for (const [k, v] of Object.entries(o)) { // Get both key and value
// Use conditional operator and better way to check for objects:
m.set(k, Object(v) === v ? objectToMap(v) : v);
}
return m;
}
// Extra argument for printing with indentation
function printMap(map, tab="") {
for (const [k, v] of map.entries()) {
// Don't print here yet...
if (v instanceof Map) {
console.log(`${tab}${k}:`); // Only print the key here...
printMap(v, tab + " "); // ...as recursion will take care of the value(s)
} else {
console.log(`${tab}${k} = ${v}`);
}
}
}
// demo
const obj = {"products":{"lemonade":{"product-type":"beverage","product-details":{"calories":"129","product-categories":[222,444]}},"limeade":{"product-type":"beverage","product-details":{"calories":"220","product-categories":[222,444],"salesIndex":{"percentage":1101,"demographics":"region-1"}}}}};
const m = objectToMap(obj.products);
printMap(m);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句