javascript:推入空数组的意外行为
javascript: unexpected behavior pushing into empty array
以下代码:
var arr1 = [1,2,3];
var obj1 = {};
for (var j = 0; j < arr1.length; j++) {
if (obj1[j.toString()])
obj1[j.toString()] = obj1[j.toString()].push(j)
else
obj1[j.toString()] = [].push(j);
}
产生了以下输出:
obj1
=> { '0': 1, '1': 1, '2': 1 }
我很想知道为什么。
(我现在知道以下代码:
var arr1 = [1,2,3];
var obj1 = {};
for (var j = 0; j < arr1.length; j++) {
if (obj1[j.toString()])
obj1[j.toString()] = obj1[j.toString()].push(j)
else {
obj1[j.toString()] = [];
obj1[j.toString()].push(j);
}
}
会给我我想要的输出:
obj1
=> { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }
)
因为,as per the documentation,Array.prototype.push()
方法returns数组长度,而不是数组本身。
您可能更喜欢这样的 concat
method:
var arr1 = [1,2,3];
var obj2 = {}
for (var j = 0; j < arr1.length; j++) {
var js = j.toString()
if (obj2[js]) {
obj2[js] = obj2[js].concat([j])
} else {
obj2[js] = [j]
}
}
console.log(obj2) // => { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }
// shorter version
var obj3 = {}
for (var j = 0; j < arr1.length; j++) {
var js = j.toString()
obj3[js] = [].concat(obj3[js] || [], [j])
}
console.log(obj3) // => { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }
以下代码:
var arr1 = [1,2,3];
var obj1 = {};
for (var j = 0; j < arr1.length; j++) {
if (obj1[j.toString()])
obj1[j.toString()] = obj1[j.toString()].push(j)
else
obj1[j.toString()] = [].push(j);
}
产生了以下输出:
obj1
=> { '0': 1, '1': 1, '2': 1 }
我很想知道为什么。
(我现在知道以下代码:
var arr1 = [1,2,3];
var obj1 = {};
for (var j = 0; j < arr1.length; j++) {
if (obj1[j.toString()])
obj1[j.toString()] = obj1[j.toString()].push(j)
else {
obj1[j.toString()] = [];
obj1[j.toString()].push(j);
}
}
会给我我想要的输出:
obj1
=> { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }
)
因为,as per the documentation,Array.prototype.push()
方法returns数组长度,而不是数组本身。
您可能更喜欢这样的 concat
method:
var arr1 = [1,2,3];
var obj2 = {}
for (var j = 0; j < arr1.length; j++) {
var js = j.toString()
if (obj2[js]) {
obj2[js] = obj2[js].concat([j])
} else {
obj2[js] = [j]
}
}
console.log(obj2) // => { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }
// shorter version
var obj3 = {}
for (var j = 0; j < arr1.length; j++) {
var js = j.toString()
obj3[js] = [].concat(obj3[js] || [], [j])
}
console.log(obj3) // => { '0': [ 0 ], '1': [ 1 ], '2': [ 2 ] }