2009-02-19 35 views
2

我有一组键/值,例如orange = 123,banana = 4,apple = 567。我怎样才能这些键/值存储在一个javascript对象,使得我可以:如何在javascript中定义一组键/值并查找值并按顺序迭代集合?

  1. 检索经由查找例如设定一个值[“橙色”]应该返回123和,
  2. 遍历集合在键/值对的添加顺序

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

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

+0

同样的问题,想一些回应 – 2009-02-19 07:21:41

回答

2

你的两个假设都是正确的。对象文字不保证以任何顺序返回键。

做到不旋转你自己的类型的唯一方法是保持键的有序列表:

var obj = { 
    orange:123, 
    banana:4, 
    apple:567 
} 

var keys = ['orange', 'banana', 'apple']; 

for (var i=0; i<keys.length; i++){ 
    value = obj[keys[i]]]; 
} 

丑陋的,我知道。

+1

封装所有这些在他自己的类型会更好,虽然 – annakata 2009-02-19 09:40:37

+0

...或者只是为了使用数组实现键值对: var data = [[“orange”,123],[“banana”,4],[“ap ple“,567]]; – 2010-09-01 07:52:47

0

你可以以不同的方式:

var a = {'orange':123, 'banana':4, 'apple':567}; 

var b = new Object(); 
b['orange'] = 123; 
b['banana'] = 4; 
b['apple'] = 567; 

var c = new Object(); 
c.orange = 123; 
c.banana = 4; 
c.apple = 567; 

语法不同,但内部的三个声明是等效的。

+0

var b选项是否真的有效? – 2009-02-19 07:31:59

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)' 
*/ 
} 

现在你可以把它生(您添加道具的顺序保持不变)或排序:

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 
    */ 
2

一个简单的封装:

function Dictionary(p) 
{ 
    if(!this.Add) 
    { 
     Dictionary.prototype.Add = function(a) 
     { 
      if(!a.length) {a = [a];} 
      for(var i = 0, n=a.length; i<n; i++) 
      { 
       for(x in a[i]) 
       { 
        this[x] = a[i][x]; 
        this.keys.push(x); 
       } 
      } 
     } 
    } 

    this.keys = []; 

    if(typeof(p)!='undefined') {this.Add(p);} 
} 

var a = new Dictionary({'orange':123, 'banana':4, 'apple':567}); 

alert(a.keys);//returns [orange,banana,apple] 

alert(a.keys[0]);//returns orange 

alert(a.orange) //returns 123 

a.Add({'mango':88}); //another way to add data 

a.Add([{kiwi:16},{grapefruit:79}]) //another way to add data 

alert(a.keys);//returns [orange,banana,apple,mango,kiwi,grapefruit]