为什么我无法在json数据上调用.get /如何将json转换为地图

时间:2016-12-13 15:09:53

标签: javascript json

我试图为一个以地图作为参数的函数编写测试,

当代码在测试之外正常运行时,参数可以采用表单(当我调用toString时):

Map { "id": "jobs", "label": "Jobs", "nodeType": "ROOT", "childNodesURI": "jobs?owner=*", "childIds": List [], "isFetchingChildren": false, "isToggled": true, "jobName": "" }

var node = {
                id: "jobs", 
                label: "JES Jobs", 
                nodeType: "ROOT", 
                childNodesURI: "jobs?owner=*", 
                childIds: [],
                isFetchingChildren: false, 
                isToggled: true, 
                jobName: "" };
                console.log(node.get("id"));

当调用node.get(" id")时,我得到" TypeError:node.get不是函数"

我假设这是因为没有函数.get()foo一个JSON对象但不是真正确定...如果是这种情况,我如何将JSON转换或初始化为地图吗?

2 个答案:

答案 0 :(得分:2)

您向我们展示的是一个javascript对象。如果您在这种情况下需要拨打“密钥”,则应使用theObject.theProperty,如下所示

var node = {
  id: "jobs",
  label: "JES Jobs",
  nodeType: "ROOT",
  childNodesURI: "jobs?owner=*",
  childIds: [],
  isFetchingChildren: false,
  isToggled: true,
  jobName: ""
};

//Call the object property ID
console.log(node.id);

如果您需要地图,您需要这样:

var myMap = new Map();

// setting the values
myMap.set("id", "jobs");

console.log(myMap.get("id"));

如果您想从对象开始创建地图,可以像这样做

var node = {
  id: "jobs",
  label: "JES Jobs",
  nodeType: "ROOT",
  childNodesURI: "jobs?owner=*",
  childIds: [],
  isFetchingChildren: false,
  isToggled: true,
  jobName: ""
};

function buildMap(obj) {
    let map = new Map();
    Object.keys(obj).forEach(key => {
        map.set(key, obj[key]);
    });
    return map;
}

const map = buildMap(node);

console.log(map.get("id"));

答案 1 :(得分:1)

您只需使用自己的代码访问node.id即可。除非您自己扩展原型,否则对象文字上没有get()方法。

Map应该根据文档创建一个可迭代对象作为参数。但实际上我发现在使用对象而不是数组时会产生undefined is not a function错误。 另外,在查看文档时,浏览器支持还不完整(https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map)。

例如(引自上面的链接):

  

[1]从Chrome 31开始,此功能可在首选项后面使用。在chrome:// flags中,激活“启用实验性JavaScript”条目。

我看到你的选择是;你可以迭代你的JSON

var m = new Map();
var json = {'foo': 'bar'};

for(var i in json) {
    m.set(i, json[i]);
}
m.get('foo');

或者如果你真的不需要Map方法坚持使用对象文字。

json.foo;