参考下面的代码
var init = {
0: {
id: '1'
},
1: {
id: '2'
}
}
var obj = {};
for (var i in init){
.......
}
现在是需求就是有一个对象的变量
我知道.push()
对象并不能调用
所以想会不会有什么方法能跟数组一样能使用.push()
方法?
黄舟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]);
}
这样在遍历的时候会多出 length
和 push
,自己过滤一下就好了
迷茫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
属性
ringa_lee2017-04-11 12:34:45
当然可以了,但是需要给对象添加一个length
的属性,至于为什么可以这么做,去看看v8源码中对push
的定义就好,简单来说只要满足key
是number
的,并且还有length
属性就可以用push
。
init.length = Object.keys(init).length;
Array.prototype.push.call(init, {id: 3});
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]
};
这样就可以了吧!不知道是否满足你的需求。
伊谢尔伦2017-04-11 12:34:45
首先你需要把这个对象变成一个类数组对象,给它再加个属性, length:2
,此时这个对象就变成了具有一些数组方法的类数组对象,然后使用Array.prototype.push.call()
方法调用数组的push方法即可