我正在尝试扩展以下结构的对象(使用 Coffeescript 中的 JQuery):
objectThatIsAList = {
'List Item' :
callback :=>
return "Some value"
'Another item' :
callback :=>
return "Another value"
'The final item' :
callback :=>
no
}
此对象用作大型基于 CoffeeScript 的框架中下拉菜单的(动态)模型。
我正在扩展它
objectThatIsAList = $.extend {}, objectThatIsAList, {
'New Item' :
callback :=>
return "New stuff"
}
这会产生这样的对象(添加注释以显示预期结果)
objectThatIsAList = {
'List Item' :
callback :=>
return "Some value"
'Another item' :
callback :=>
return "Another value"
# this should be last
'The final item' :
callback :=>
no
# this should not be last
'New Item' :
callback :=>
return "New stuff"
}
显然,对象得到了正确的扩展,但是属性的顺序与构建列表的目的相关。 我更愿意将'Final Item'
作为扩展对象的第四个属性,而不是第三个属性。
但我的研究并未显示对 $.extend
方法的索引支持。有没有人成功实现了这样的功能和/或有关于如何将对象属性“插入”到另一个对象的某个位置的提示?
或者是否有一种巧妙的方法可以在 $.extend
之后重新定位最后一项?
不一定非得是Coffee,即使是JS或者伪代码也会有很大的帮助。
编辑:
这是我提出的解决方案,它扩展了遗留代码以获取数组并将它们转换为对象(这些对象在整个框架中广泛使用,并且更改原始代码会破坏大量工作代码):
# this comparison yields a data object that is passed to a method rendering a menu
if o.menu instanceof Array
menuArrayToObj = {}
for menuObject in o.menu
for menuObjectProperty,menuObjectValue of menuObject
menuArrayToObj[menuObjectProperty]=menuObjectValue if menuObjectProperty? and menuObjectValue?
o.menu = menuArrayToObj
else o.menu
有了这个,它就可以被提供一个对象或一个数组。后者可以通过拼接轻松插入。
最佳答案
Javascript 对象根据定义是无序的。
如果您希望保持排序,则需要一个Array
。
jQueryUI 对话框对象就是一个很好的例子。尽管可以按照 buttons
选项的方式使用 Object
,但如果您要求各个按钮按特定顺序排列,则必须提供 < em>对象数组。
使用此模型,您的对象将如下所示:
arrayThatIsAList = [
{ title: 'List Item', callback: ... },
{ title: 'Another Item', callback: ... },
{ title: 'New Item', callback: ... },
{ title: 'The final item', callback: ... }
];
关于javascript - JQuery $.extend 可以与索引一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924706/