在Javascript中获取键的属性

时间:2019-05-29 16:03:07

标签: javascript arrays object

我有一个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,并且可以正常访问xy的值。

请注意,在我的实际实现中,我不只是将数组[1, 2, 3]分配给数组的每个索引。我正在分配由另一个函数生成的数组,该数组与访问arr

中的键无关

3 个答案:

答案 0 :(得分:1)

所有对象keysstringssymbol。因此,当您尝试将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]);
}