更新:此代码正常工作:)我页面中的其他逻辑导致问题
我正在从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
我做错了什么?
答案 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
循环
let obj = { one: 1, two: 2 };
for (let [k,v] of Object.entries(obj)) {
console.log(`${k}: ${v}`);
}
&#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')
的内容进行更改