次の構造のオブジェクトを拡張しようとしています(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"
}
明らかに、オブジェクトは正しく拡張されますが、プロパティの順序はリストを作成する目的に関連しています。拡張オブジェクトの 3 番目のプロパティではなく、4 番目のプロパティとして を使用したいと考えています。'Final Item'
しかし、私の調査では、このメソッドのインデックス作成のサポートは示されませんでした$.extend
。誰かがそのような機能を正常に実装したり、特定の位置で別のオブジェクトにオブジェクトのプロパティを「挿入」する方法のヒントを持っていますか?
または、の後にその最終アイテムを再配置する賢い方法はあり$.extend
ますか?
必ずしも Coffee である必要はありません。JS や Pseudocode でも大いに役立ちます。
編集:
これは、レガシー コードを拡張して配列を取得し、それらをオブジェクトに変換する、私が思いついたソリューションです (フレームワーク全体で広く使用されており、元のコードを変更すると多くの作業コードが壊れる場合があります)。
# 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
これを配置すると、オブジェクトまたは配列のいずれかを供給することができます。後者はスプライスで簡単に挿入できます。