在javascript中订购一组键/值对的最佳实践?

时间:2011-06-20 18:45:22

标签: javascript collections

在javascript / jQuery中实现以下内容的有效(和用户友好)方式是什么?

取决于文件的mime类型,应该执行回调。回调是由开发人员通过提供带有可选通配符的mime类型描述(例如text / javascript,text / * ,* / *)和回调本身来定义的。必须有一个指定的顺序,其中声明的类型与文件的给定mime类型匹配。例如,text / plain的优先级高于text /*.

这里有一些想法:

使用简单对象

var handler = {
 'text/javascript' : callback0,
 'text/*' : callback1
}

是最直观的解决方案,但订购无法保证

维护两个列表

var order = ['text/javascript', 'text/*'];
var handler = [callback0, callback1];

如果有超过两种或三种类型并且您使用匿名函数作为回调,则很难维护。

通过将回调包装到对象中来添加索引

var handler = {
  'text/javascript' : {index: 0, callback0},
  'text/*' : {index: 1, callback1}
};

...在开头插入项目时更改数千个索引属性。

使用数组数组

var handler = [
  ['text/javascript', callback0],
  ['text/*', callback1]
];

这可能比其他用户更友好,但是没有迭代元素就没有直接访问已知的mime类型(这将是很好的)。

所以有一些方法可以做我想要的事情,但是什么是正确的方式(以及为什么)?也许有人有模式?

最佳, Hacksteak

2 个答案:

答案 0 :(得分:2)

我会使用'简单对象'解决方案和订单数组形成'维护两个列表'解决方案。

使用一个代码块迭代order数组,该代码块使用handler简单对象做一些破坏循环或继续下一个循环迭代的事情。

编辑回应评论

我同意你的意见。我会做这样的事情,使它只是一个变量:

var handlers = {
  handler: {
    'text/javascript': callback0,
    'text/*': callback1
  },
  order: ["text/javascript", "text/*"]
};

虽然我会为handlers变量和/或handlers.handler属性选择更好的名称。

对另一个评论的另一个回应

也许你应该只修改handlers.handlerhandlers.order一次性的mime-type:

var handlers = { handler: {}, order: [] }; // initialize as empty

// add 'text/javascript' mime type
handlers['text/javascript'] = callback0;
handlers.order.push('text/javascript');

// add 'text/*' mime type
handlers['text/*'] = callback1;
handlers.order.push('text/*');

这种方法有点重复,但将来应该很容易维护。如果需要,您可以编写一个向handlers.handler添加新属性的函数,并将新的mime类型附加到handlers.order

答案 1 :(得分:1)

对于大多数供应商而言,对象的排序似乎是按插入顺序排列的,除了V8之外,除了数字索引之外这是正确的。请参阅以下参考资料。

我可能不会做任何循环。我可能会做这样的事情:

var handler = {
    text: {
        javascript: callback0,
        '*': callback1
    },
    '*' : {
        '*': callback3
    }
};
var mime = 'whatevs/whatevs'.split('/');
var callback = handler[mime[0]][mime[1]] || handler['*']['*'];
callback();

参考

  1. Iterating JavaScript object properties and arrays with for..in when ordering is important
  2. http://code.google.com/p/v8/issues/detail?id=164
相关问题