如何在javascript和两个查找值中定义一组键/值并按顺序迭代该组?

eft*_*eft 2 javascript

我有一组键/值,例如orange = 123,banana = 4,apple = 567.如何将这些键/值存储在javascript对象中,以便我可以:

  1. 通过查找检索值,例如set ["orange"]应返回123 and,
  2. 按照添加键/值对的顺序迭代集合.

似乎对于1.对象文字是合适的但迭代顺序不是保证的,而对于2.一组键/值对(对象文字)将提供迭代顺序而不是基于的查找值的能力关键.

@*感谢所有答案 - 这个问题不是常见问题吗?像jQuery这样的库不包含对这种类型的支持吗?

Koo*_*Inc 7

如何烹饪自己的列表构造函数?

function List(obj) {

  if (this instanceof List) {
   var t     = this,
       keys  = [];

    /* inititalize: add the properties of [obj] to the list, 
       and store the keys of [obj] in the private keys array */
    for (var l in obj) {
       keys.push(l);
       t[l] = obj[l];
    }
    /* public:
       add a property to the list 
    */
     t.add = 
         function(key, value) {
              t[key] = value;
              keys.push(key);
              return t; /* allows method chaining */
            };

    /* public:
       return raw or sorted list as string, separated by [separator] 
       Without [sort] the order of properties is the order in which 
       the properties are added to the list
    */
     t.iterate =
       function(sort,separator){
         separator = separator || '\n';
         var ret   = [],
             lkeys = sort ? keys.slice().sort() : keys;

         for (var i=0;i<lkeys.length;i++){
           ret.push(lkeys[i]+': '+t[lkeys[i]]);
         }
       return ret.join(separator);
      };

  } else if (obj && obj instanceof Object) {
     return new List(obj);

  } else if (arguments.length === 2) { 
     var a    = {};
     a[String(arguments[0])] = arguments[1];
     return new List(a);

  } else { return true; }

 /* the 'if (this instanceof List)' pattern makes
    the use of the 'new' operator obsolete. The 
    constructor also allows to be initialized with
    2 parameters => 'List(key,value)' 
 */
}
Run Code Online (Sandbox Code Playgroud)

现在你可以让它原始(你添加道具的顺序被维护)或排序:

var myList = 
 List( { orange:123,
         banana:4,
         apple:567 }
     );
myList.add('peach',786);
alert(myList.iterate());
  /*=>output:
    orange: 123
    banana: 4
    apple: 567
    peach: 786
  */
or: alert(myList.iterate(1));
  /*=>output:
    apple: 567
    banana: 4
    orange: 123
    peach: 786
  */
Run Code Online (Sandbox Code Playgroud)