登录

jquery - JavaScript 怎么使用Array的push?

参考下面的代码
var init = {
    0: {
        id: '1'
    },
    1: {
        id: '2'
    }
}

var obj = {};

for (var i in init){
    .......
}

现在是需求就是有一个对象的变量
我知道.push()对象并不能调用
所以想会不会有什么方法能跟数组一样能使用.push()方法?

# JavaScript
天蓬老师天蓬老师2172 天前522 次浏览

全部回复(5) 我要回复

  • 黄舟

    黄舟2017-04-11 12:34:45

    var init = {
        0: { id: "1" },
        1: { id: "2" }
    };
    
    init.length = 2;
    init.push = Array.prototype.push.bind(init);
    
    init.push({ id: "3"});
    
    for (var i in init) {
        console.log(i, init[i]);
    }

    这样在遍历的时候会多出 lengthpush,自己过滤一下就好了

    回复
    0
  • 迷茫

    迷茫2017-04-11 12:34:45

    https://github.com/v8/v8/blob...

    补充最高票内容 push的实现

      var array = TO_OBJECT(this);
      var n = TO_LENGTH(array.length);
      var m = arguments.length;
    
      // Subtract n from kMaxSafeInteger rather than testing m + n >
      // kMaxSafeInteger. n may already be kMaxSafeInteger. In that case adding
      // e.g., 1 would not be safe.
      if (m > kMaxSafeInteger - n) throw %make_type_error(kPushPastSafeLength, m, n);
    
      for (var i = 0; i < m; i++) {
        array[i+n] = arguments[i];
      }
    
      var new_length = n + m;
      array.length = new_length;
      return new_length;

    this需要的条件只是length属性

    回复
    0
  • ringa_lee

    ringa_lee2017-04-11 12:34:45

    当然可以了,但是需要给对象添加一个length的属性,至于为什么可以这么做,去看看v8源码中对push的定义就好,简单来说只要满足keynumber的,并且还有length属性就可以用push

    init.length = Object.keys(init).length;
    Array.prototype.push.call(init, {id: 3});

    回复
    0
  • PHP中文网

    PHP中文网2017-04-11 12:34:45

    var init = {
        0: {
            id: '1'
        },
        1: {
            id: '2'
        }
    }
    var obj = {};
    for (var i in init){
        obj[i] = init[i]
    };

    这样就可以了吧!不知道是否满足你的需求。

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 12:34:45

    首先你需要把这个对象变成一个类数组对象,给它再加个属性, length:2 ,此时这个对象就变成了具有一些数组方法的类数组对象,然后使用Array.prototype.push.call()方法调用数组的push方法即可

    回复
    0
  • 取消回复发送