这是由相同字符串组成的两个不同“数组”的控制台输出。我不知道它们是如何产生的(有很多代码我没有编写),但我认为只有Object2是真正的数组,因为它具有长度函数。调用Object1.length会返回0。
尽管在控制台中称Object1为数组,但它似乎实际上是一个带有数字属性的对象。如何确保永远不使用Object1类型的数组,并且所有数组看起来都像Object2?
Object1
Array {0: 'ABC', 1: 'IJK', 2: 'XYZ'}
0: "ABC"
1: "IJK"
2: "XYZ"
[[Prototype]]: Array(0)
Object2
(3) ['ABC', 'IJK', 'XYZ']
0: "ABC"
1: "IJK"
2: "XYZ"
length: 3
编辑1: Object1和Object2只是我在这个例子中使用的变量名。
调用Array.isArray(Object1) = false,而Array.isArray(Object2) = True。那么如何创建一个名为Array的对象呢?[这个问题已经在评论中由CRice回答。请参见编辑3]
编辑2: 代码在AngularJS的一个庞然大物中,但以下是一些显示数据来源的代码。Object1是一个变量,它应该包含模型中称为“someArray”的数组,并使用适配器进行初始化。Object2则像传统的内联数组一样创建:Object2 = [];
模型
define([], function () {
return [
function () {
function SomeObjectModel(someArray) {
this.someArray = someArray;
}
SomeObjectModel.prototype.serialize = function () {
return {
someArray: this.someArray,
};
};
SomeObjectModel.build = function (data) {
return new SomeObjectModel(data.someArray);
};
return SomeObjectModel;
},
];
});
适配器
var serializedSomeObject = someObjectInstance.serialize();
return $http({
method: 'PUT',
url: 'someUrl.com/api',
data: serializedSomeObject,
}).then(function (response) {
return SomeObjectModel.build(response.data);
});
编辑3: @CRice指出,此代码可以复制调用自身数组但不表现为数组的Object1实例:
var o = { 0: 'ABC', 1: 'IJK', 2: 'XYZ' };
Object.setPrototypeOf(o, Array.prototype);
console.log(o);
编辑4: 我不知道为什么序列化然后反序列化会导致这种情况,但我的解决方案是遍历Object1的属性,将它们推入一个新数组,然后就行了。以下是我将Object1转换为Object2的解决方案:
var Object2 = [];
var attr = Object.getOwnPropertyNames(Object1);
for(var i=0; i<attr.length; i++){
Object2.push(Object1[attr[i]]);
}
console.log(Object2);
感谢CRice帮助我在控制台中重现它!
o = {0: "ABC", 1: "IJK", 2: "XYZ"}; Object.setPrototypeOf(o, Array.prototype); console.log(o);
在Chrome开发工具中运行时会产生几乎相同的结果。 - CRice