Javascript JQuery$.extend能否与索引一起使用?
我正在尝试扩展以下结构的对象(使用Coffeescript中的JQuery):Javascript JQuery$.extend能否与索引一起使用?,javascript,jquery,object,coffeescript,extend,Javascript,Jquery,Object,Coffeescript,Extend,我正在尝试扩展以下结构的对象(使用Coffeescript中的JQuery): objectThatIsAList={ “列表项”: 回调:=> 返回“一些值” “另一项”: 回调:=> 返回“另一个值” “最后一项”: 回调:=> 不 } 在基于coffeescript的大型框架中,此对象用作下拉菜单的(动态)模型 我正在扩展它 objectThatIsAList=$。扩展{},objectThatIsAList{ “新项目”: 回调:=> 返回“新东西” } 这会产生这样一个对象(添加
objectThatIsAList={
“列表项”:
回调:=>
返回“一些值”
“另一项”:
回调:=>
返回“另一个值”
“最后一项”:
回调:=>
不
}
在基于coffeescript的大型框架中,此对象用作下拉菜单的(动态)模型
我正在扩展它
objectThatIsAList=$。扩展{},objectThatIsAList{
“新项目”:
回调:=>
返回“新东西”
}
这会产生这样一个对象(添加注释以显示预期结果)
objectThatIsAList={
“列表项”:
回调:=>
返回“一些值”
“另一项”:
回调:=>
返回“另一个值”
#这应该是最后一次了
“最后一项”:
回调:=>
不
#这不应该是最后一次
“新项目”:
回调:=>
返回“新东西”
}
显然,对象得到了正确的扩展,但是属性的顺序与构建列表的目的相关我更希望“Final Item”
作为扩展对象的第四个属性,而不是第三个属性
但是我的研究没有显示对$.extend
方法的索引支持。是否有人成功地实现了这样的功能和/或有如何在某个位置将对象属性“插入”到另一个对象中的提示
或者是否有一种聪明的方法将最后一项重新定位在$.extend
之后
不一定是咖啡,即使是JS或伪代码也会有很大的帮助
编辑:
这是我提出的解决方案,它扩展了遗留代码以获取数组并将它们转换为对象(在整个框架中广泛使用,更改原始代码会破坏许多工作代码):
#此比较生成一个数据对象,该对象被传递给呈现菜单的方法
如果o.menu instanceof数组
menuArrayToObj={}
对于o菜单中的menuObject
对于menuObjectProperty,指定menuObject的menuObjectValue
MenuarRayToObject[menuObjectProperty]=menuObjectValue是否为menuObjectProperty?还有menuObjectValue?
o、 menu=menuArrayToObj
还有菜单吗
有了它,就可以为它提供对象或数组。后者很容易插入到带有接头的电缆中 根据定义,Javascript对象是无序的
如果您希望维持排序,则需要一个数组
jQueryUI对话框对象就是一个很好的例子。虽然可以使用对象
,就像使用按钮
选项一样,但如果您要求各个按钮按特定顺序排列,则必须提供一个对象数组
使用此模型,对象看起来像:
arrayThatIsAList = [
{ title: 'List Item', callback: ... },
{ title: 'Another Item', callback: ... },
{ title: 'New Item', callback: ... },
{ title: 'The final item', callback: ... }
];
根据定义,Javascript对象是无序的
如果您希望维持排序,则需要一个数组
jQueryUI对话框对象就是一个很好的例子。虽然可以使用对象
,就像使用按钮
选项一样,但如果您要求各个按钮按特定顺序排列,则必须提供一个对象数组
使用此模型,对象看起来像:
arrayThatIsAList = [
{ title: 'List Item', callback: ... },
{ title: 'Another Item', callback: ... },
{ title: 'New Item', callback: ... },
{ title: 'The final item', callback: ... }
];
将具有第一个属性的对象作为调用
$的第一个参数。extend
:
objectThatIsAList = $.extend {
'New Item' :
callback :=>
return "New stuff"
}, objectThatIsAList
“不!”您大声喊道,“ECMAScript规范明确地保留了未定义的属性枚举顺序!”
是的,没错。正确的观点但是,所有现代ECMAScript实现都按照定义属性的顺序枚举属性。它成为事实上的标准。请在此处尝试:。我怀疑任何人都找不到按定义顺序以外的顺序列出属性的浏览器
因此,它不能保证符合规范,但就所有实际用途而言,它的工作原理是一致的
但是,请注意,如果开始使用整数作为属性名,则浏览器之间的结果将不一致。在调用
$时,将属性位于第一位的对象作为第一个参数。extend
:
objectThatIsAList = $.extend {
'New Item' :
callback :=>
return "New stuff"
}, objectThatIsAList
“不!”您大声喊道,“ECMAScript规范明确地保留了未定义的属性枚举顺序!”
是的,没错。正确的观点但是,所有现代ECMAScript实现都按照定义属性的顺序枚举属性。它成为事实上的标准。请在此处尝试:。我怀疑任何人都找不到按定义顺序以外的顺序列出属性的浏览器
因此,它不能保证符合规范,但就所有实际用途而言,它的工作原理是一致的
但是,请注意,如果开始使用整数作为属性名,则浏览器之间的结果将不一致。$。extend()
用于将两个或多个对象合并为一个对象它不管理订单
如果要对数据进行排序,应使用对象数组(它允许您使用其索引操作数据)并使用自定义排序函数来比较对象标题:
yourArray.sort(sortfunction);
function sortfunction(yourObjectA, yourObjectB){
//Compare yourObjectA and yourObjectB, and return -1, 0, or 1
}
$.extend()
用于将两个或多个对象合并为一个对象它不管理订单
如果要对数据进行排序,应使用对象数组(它允许您使用其索引操作数据)并使用自定义排序函数来比较对象标题:
yourArray.sort(sortfunction);
function sortfunction(yourObjectA, yourObjectB){
//Compare yourObjectA and yourObjectB, and return -1, 0, or 1
}
您希望如何为对象编制索引?JS对象属性的排序是未经设计定义的。这是我面临的问题,或者说是试图回避的问题。我正在使用的菜单生成方法不具备使用数组来构建其输出的能力(这很糟糕,但目前无法更改),因此我正在尝试找到一种方法