4

如果我将附加属性附加到一个对象,它是否必须放在最后,或者我可以将它放在指定的位置。

function reassign(obj){
  delete obj.c;
  obj.c = "new three";

  var t = "<table border=\"1\">";
  for (var i in obj){
    t += "<tr><td>" + obj[i] + "</td></tr>"; 
  }
  t += "</table>";
  return t;
}

var obj = {
  a : "one",
  b : "two",
  c : "three",
  d : "four" 
};

var reassigned = reassign(obj);
document.write(reassigned);

是否有可能obj.c在删除后以某种方式再次将新的放在第三位,而不是将其附加到末尾?当然我可以跳过删除部分。但即使没有这个,我也可以例如打算注入alphabeta: "one point five"第二个位置。是否可以?谢谢!

jsbin

4

2 回答 2

3

数组元素是有序的;对象属性不是。您永远不应该假设对象属性将按特定顺序迭代。

如果顺序对您很重要,请创建一个order:[]包含属性名称数组的新属性,您可以遍历它:

var obj = {
  a : "one",
  b : "two",
  c : "three",
  d : "four",
  order : ['a','b','c','d']
};
于 2013-01-24T16:09:23.663 回答
1

对象是无序的。您可以创建一个数组并将对象分解为键值对,也可以使用数组来索引对象键。

选项1

var collection = [
  {key1: value1},
  {key2: value2},
  {key3: value3}
];

选项 2

var obj = {
  key1: value1,
  key2: value2,
  key3: value3
};

// you can index just the values
var index_to_value = [
  obj['key1'],
  obj['key2'],
  obj['key3']
];

// or you can index by key, if necessary
var index_to_key = [
  'key1', 'key2', 'key3'
];

当然,如果它不干扰,您可以将索引放在对象中:

var obj = {
  key1: value1,
  key2: value2,
  key3: value3,
  _index: [
    'key1', 'key2', 'key3'
  ]
};

而且,我建议使用排序和比较功能拼接来管理索引。

于 2013-01-24T16:12:31.260 回答