从JavaScript对象检索属性

时间:2016-06-25 07:57:48

标签: javascript ecmascript-6 javascript-objects

更新:此代码正常工作:)我页面中的其他逻辑导致问题

我正在从jQuery数据对象中读出一个JavaScript对象:

 void mouse_call(int event,int x,int y,int,void*)
    {
        if(event==EVENT_LBUTTONDOWN)
        {
            leftDown=true;
            cor1.x=x;
            cor1.y=y;
           cout <<"Corner 1: "<<cor1<<endl;

        }
        if(event==EVENT_LBUTTONUP)
        {
            if(abs(x-cor1.x)>20&&abs(y-cor1.y)>20) //checking whether the region is too small
            {
                leftup=true;
                cor2.x=x;
                cor2.y=y;
                cout<<"Corner 2: "<<cor2<<endl;
            }
            else
            {
                cout<<"Select a region more than 20 pixels"<<endl;
            }
        }

        if(leftDown==true&&leftup==false) //when the left button is down
        {
            Point pt;
            pt.x=x;
            pt.y=y;
            Mat temp_img=img.clone();
            rectangle(temp_img,cor1,pt,Scalar(0,0,255)); //drawing a rectangle continuously
            imshow("Original",temp_img);

        }
        if(leftDown==true&&leftup==true) //when the selection is done
        {

            box.width=abs(cor1.x-cor2.x);
            box.height=abs(cor1.y-cor2.y);
            box.x=min(cor1.x,cor2.x);
            box.y=min(cor1.y,cor2.y);
            Mat crop(img,box);   //Selecting a ROI(region of interest) from the original pic
            namedWindow("Cropped Image");
            imshow("Cropped Image",crop); //showing the cropped image
            leftDown=false;
            leftup=false;

        }
    }

我可以成功访问此对象的内容

$('body').data('myvals', {var1:"lorem",var2:"ipsum",var3:"dolores",var4:"amet"});
var obj = $('body').data('myvals');

返回(在Firefox控制台中):

console.log(Object.entries(obj));

但我没有成功检索特定属性(通过访问'var1'获得'lorem')。以下尝试返回[["var1", "lorem"], ["var2", "ipsum"], ["var3", "dolores"], ["var4", "amet"]]

undefined

我做错了什么?

4 个答案:

答案 0 :(得分:0)

这:

[["var1", "lorem"], ["var2", "ipsum"], ["var3", "dolores"], ["var4", "amet"]]

是一个索引为keys的数组。它不是一个Object(即使在Javascript中,几乎所有东西都是一个Object)所以当你尝试obj.var1时,你会得到未定义的。 因为那里没有obj.var1。有obj [0]持有数组(“var1”,“lorem”);在里面。

这:

{"var1":"lorem"}, {"var2":"ipsum"},{"var3":"dolores"},{"var4":"amet"}

是一个Object,如果你输入console.log(obj.var1),你就会得到“lorem”。

你添加了更多代码,因为我回答所以我知道需要改变我的答案。 您的问题是“ Object.entries()”,这将返回数组,您需要使用

Object.keys(obj) .forEach(function(key){
 console.log(key);
});

<强>加成 您的问题布局和提供的信息有点令人困惑。 避免你在开始时写的内容,只关注你最后一个问题,你唯一的错误就是:

console.log(obj[var1]);

应该是

console.log(obj["var1"]);

除此之外,它应该按预期工作。

答案 1 :(得分:0)

这很好用,我看不出有什么问题: DEMO

$('body').data('myvals', {var1:"lorem",var2:"ipsum",var3:"dolores",var4:"amet"});
var obj = $('body').data('myvals');
console.log(obj.var1);
console.log(obj['var1']);

如果上面的代码不起作用,请尝试console.log($('body').data('myvals'));并查看它是否返回任何值。

如果它返回undefined,那么您可能忘记使用文档就绪,只需尝试将代码包装在$(function(){ ... })

答案 2 :(得分:0)

您可以使用解构来访问从Object.entries成对返回的条目,如下所示:

Object.entries(obj).forEach(([key, value]) => {
  console.log(key);
  console.log(value);
})

使用for-of循环

进行迭代的另一种方法

&#13;
&#13;
let obj = { one: 1, two: 2 };
for (let [k,v] of Object.entries(obj)) {
  console.log(`${k}: ${v}`);
}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

不是将Object.entries(obj)打印到控制台,而是将对象本身打印到控制台更清晰。条目清单会分散您正在处理的问题。我的意思是:

var obj = $('body').data('myvals');
console.log(obj);

//or this
console.log(JSON.stringify(obj));

这将显示关联数组的实际内容。从那里,其中任何一个应该工作。不要忘记对数组索引使用字符串引号:

console.log(obj.var1);
console.log(obj["var1"]); // obj[var1] is incorrect, need quotes

如果您在上面的完整对象打印输出中看到“var1”作为键,那么此处也应显示单个属性。否则,在您提取“var1”时,代码的其他部分必须对obj$('body).data('myvals')的内容进行更改