如何使用 Javascript 打印地图的嵌套列表

布林迪恩

我有一个将一组 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()在两种情况下调用时ifelse从调用开始,并用条件(三元)运算符区分参数

所以像这样:

// 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章