我有一个像下面的数组,
var array=[];
array[0]={id:BBB,Name:"BBB"}
array[1]={id:AAA,Name:"AAA"}
Run Code Online (Sandbox Code Playgroud)
我想将此数组转换为如下所示的数组集合
var collection={}
array.forEach(function(arr){
collection[arr.id]=true;
});
Output : collection={AAA:true,BBB:true} // this is output is sorted in alphabetic order, actually what i want is like below,
Output : collection={BBB:true,AAA:true} // this is the expected result
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?
这是一个对象,而不是"数组集合".虽然对象属性具有顺序(不是按字母顺序排列),但它通常没有用,最好在很大程度上忽略这一事实.你可能在devtools中看这个并扩展对象的显示; 在该视图中,devtools可能会按字母顺序显示属性,以便您轻松找到所需内容.
您正在向对象添加条目(而不是"数组集合").对象中属性的顺序很复杂(它们的确具有ES2015的顺序),但基本上对于对象的"自有"属性,顺序是您添加它们的顺序(除了看起来像整数索引的东西的处理方式不同) .
但是,如果您在devtools中查看对象的扩展表示,它可能会按字母顺序显示对象的属性.这对您来说只是一个方便的功能,并不意味着对象的属性是按顺序排列的.
例如:
var o = {};
o.b = 42;
o.c = 42;
o.a = 42;
console.log("object", o);
console.log("json", JSON.stringify(o));Run Code Online (Sandbox Code Playgroud)
Open the browser's devtools, then hit Run.Run Code Online (Sandbox Code Playgroud)
在Chrome上,当我运行它时,我看到了这个:
注意顺序,b,c,a -我加的属性的顺序.
但是,如果我用小箭头扩展该对象:
在展开的视图,它显示了他们作为a,b,c -字母为了方便.
另请注意,JSON是按对象顺序排列的(这是规范所要求的,因此当JSON根本没有顺序时,通过JSON.stringify在兼容的JavaScript引擎上使用will 序列化JavaScript对象创建的JSON按对象顺序列出属性).
对象属性的顺序不是它通常有用的东西; 他们太难控制了.如果需要订购,请使用数组.但是因为看起来你不想要订单,那很好,只是不要担心结果对象的属性看起来的顺序.