我有一个key/value
数组,可以通过执行以下操作来定义:
var arr;
function assign(iSize, jSize)
{
arr = {};
for (var i = 0; i < iSize; i++) {
for (var j = 0; j < jSize; j++) {
var pt = new Point(i, j);
arr[pt] = [1, 2, 3];
}
}
}
我的Point
函数在哪里
function Point(x, y) {
this.x = x;
this.y = y;
}
现在我想遍历数组的所有值,但是我也需要知道键。我尝试过
function iterate() {
for(var e in arr) {
console.log(e.x);
}
}
,但它只是打印出undefined
。另外,如果我尝试
function iterate() {
console.log(Object.keys(arr));
}
我刚得到[object Object]
作为输出。
我已经尝试在创建时打印出Point
,并且可以正常访问x
和y
的值。
请注意,在我的实际实现中,我不只是将数组[1, 2, 3]
分配给数组的每个索引。我正在分配由另一个函数生成的数组,该数组与访问arr
答案 0 :(得分:1)
所有对象keys
是strings
或symbol。因此,当您尝试将object
用作另一个key
的{{1}}时,会使用toString()方法将其强制转换为字符串object
。您可以在下一个示例中对其进行检查:
[object object]
let obj = {a: "something"};
console.log(obj.toString());
您想做的一种解决方案是使用Map
.as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;}
的{{1}}是 String 和 Symbol ,而对于,它们可以是任何值keys
,包括函数,对象和任何基元。
Object
Map
另一种解决方案是将Map
方法添加到您的 Point 类中,以避免调用function Point(x, y)
{
this.x = x;
this.y = y;
}
var arr;
function assign(iSize, jSize)
{
arr = new Map();
for (var i = 0; i < iSize; i++)
{
for (var j = 0; j < jSize; j++)
{
var pt = new Point(i, j);
arr.set(pt, [1, 2, 3]);
}
}
}
function iterate()
{
arr.forEach((val, key) =>
{
console.log("key => ", JSON.stringify(key), " val => ", JSON.stringify(val));
});
}
assign(2, 2);
iterate();
,如here所述:
toString()
Object.prototype.toString()
toString()
答案 1 :(得分:0)
您的主要问题是arr[pt] = [1, 2, 3];
。当您使用var pt = new Point(i, j);
新Point(i,j)的结果,它对象{x:i, y:j}
当您尝试将对象用作另一个对象的键(arr[pt] = [1, 2, 3];
)引擎时,就像arr[pt.toString()]
那样理解它,因为typeof pt === 'object'
只需在arr[pt]
中使用另一个键
如果确实需要使用对象作为键,则可以为Point编写自己的toString。像这样:
Point.prototype.toString = function pointToString() {
var ret = JSON.stringify(this);
return ret;
}
然后使用它
function iterate(){
for(var e in arr){
console.log(JSON.parse(e).x);
}
}
答案 2 :(得分:0)
主要问题是您使用对象(点)作为键。如果保存对此对象的引用,然后将其用作键,则会获得属性(我介绍的代码中的最后一个属性)。您真的需要Point对象作为键吗?
var arr;
var ptRef;
function assign(iSize, jSize) {
arr = {};
ptRef = {};
for (var i = 0; i < iSize; i++) {
for (var j = 0; j < jSize; j++) {
var pt = new Point(i, j);
console.log(pt);
arr[pt] = [1, 2, 3];
ptRef = pt;
}
}
console.log(arr[ptRef]);
}