【问题标题】:Creating a JavaScript array-like object that can be used like an array and an object创建一个可以像数组和对象一样使用的 JavaScript 类数组对象
【发布时间】:2017-10-15 02:20:03
【问题描述】:

是否可以创建一个可以像数组和对象一样使用的对象?

到目前为止我得到的最接近的是下面,它只允许您使用数组键或对象属性分配一个值:

var ALO = {
  db: {}
};
Object.defineProperty(ALO, 'length', {
  get: function() {
    var count = 0;
    for (var prop in ALO.db) {
      if (ALO.db.hasOwnProperty(prop)) count++;
    }
    return count;
  },
  enumerable: false
});

function add(baseObj, obj) {
  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      if (!isNaN(prop)) {
        //create a default string begining with i
        baseObj.db["i" + prop] = obj[prop];
      } else {
        baseObj.db[prop] = obj[prop];
      }

      Object.defineProperty(baseObj, prop, {
        get: function() {
          return baseObj.db[prop];
        },
        set: function(newValue) {
          baseObj.db[prop] = newValue;
        },
        enumerable: false,
        configurable: true
      });

      Object.defineProperty(baseObj, baseObj.length - 1, {
        get: function() {
          return baseObj.db[prop];
        },
        set: function(newValue) {
          baseObj.db[prop] = newValue;
        },
        enumerable: false,
        configurable: true
      });
    }
  }
}

add(ALO, {
  "myprop": "myvalue"
});
document.write(ALO["myprop"] + "<br>");
ALO[0] = "mynewvalue";
document.write(ALO["myprop"] + "<br>");
ALO["myprop"] = "mynewervalue";
document.write(ALO["myprop"]);

我希望能够在分配不存在的项目时自动创建所需的内容,例如

ALO[1] = "create and assign this string";

ALO["somenonexistingprop"] = "another string";

【问题讨论】:

  • 你想得到什么行为不同于普通的 JS 对象,即var a = {}
  • @Barmar 感谢您的链接,但我所追求的是一种使用这个类数组对象的方法,就像一个数组一样,也完全像一个对象。我想要所有可用于数组的方法,并且我想以与本机相同的方式使用它们。
  • 所以你想让a.prop = "foo"push 一样工作吗?你为什么想这么做?用例是什么?

标签: javascript arrays javascript-objects defineproperty


【解决方案1】:

相信你会发现Javascript中的普通Arrays继承自Object,这意味着你可以像普通对象一样滥用它们。

let MyArray = [1, 2, 3];
console.log('let MyArray = [1, 2, 3];');

console.log('Typeof MyArray = ', typeof(MyArray));

console.log('Wait.....');

console.log('So can I just assign stuff to an array like an object?');

MyArray['key'] = 'value';
console.log(`MyArray.key = 'value';`);
console.log('console.log(MyArray.key) =>', JSON.stringify(MyArray.key));

console.log('Keys:', JSON.stringify(Object.keys(MyArray)));
console.log('Array Length:', MyArray.length);

console.log('TADA, the standard browser Array does what you want');

除了很混乱之外,可能有不这样做的原因,但我相信它会满足您的要求,并且不需要代码!

编辑:在阅读了折叠下方的一些 cmets 之后,似乎 OP 出于某种原因想要访问在 Object 模式中添加的属性作为数组成员。如果您需要,您可以使用Object.keys(MyArray) 而不是MyArray,如上面控制台输出的最后几行所示。

【讨论】:

  • @Craig,这适合您的用例吗?如果没有,请告诉我它不能做什么。
  • 并非如此。我想使用索引(0、1、2、3 等)或键('key'、'first_name'、'age' 等)访问相同的值。因此,对于返回“值”的 MyArray['key'] 示例,我还希望能够使用 MyArray[3] 并获得“值”。如果我使用 'key' 或 3 设置一个新值,我希望它同时更新两者。我还希望长度返回 'key' 和 3 被计为 1 的值的数量(同样的事情)
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多