将数组值(vcard 参数)排序为变量

Sorting array values (vcard parameters) to variables

我有以下问题:

(后面的都需要用JS解决)

我有一个数组,其中包含 vcard 的参数,并且我定义了一些变量。我想要达到的是,将数组的参数或参数带入变量。所以我有一个看起来像这样的数组:

array[0] --> BEGIN:VCARD  
array[1] --> VERSION: 3.0  
array[2] --> FN: John Doe  
array[3] --> url: www.google.de  
array[4] --> title: ceo

等等。现在的问题是,有两个(或更多版本和种类)属性看起来像什么,例如。工作电话可以看起来像:TEL;WORK;VOICETEL;WORK;或者TEL,或者TEL;TYPE=voice,work,或者TEL; TYPE=voice,work,pref,或者TEL TYPE=work, CHARSET=UTF-8,或者更多的可能性。 另一个问题是,(取决于 vcard 信息)参数以另一种方式排序,所以有时 url 在末尾,有时在中间,有时在开头,与其他参数相同。

我现在拥有的另一件事是变量,定义为: var Accname, Street, City, PostCode, Country, FirstName, LastName, JobTitle, Mail, PhoneNumber;

有人知道如何解决这个问题吗?

我唯一想到的是询问数组中的每个元素是否存在(因为我不知道那里有多少元素)然后询问从 0 开始有尽可能多的 for 循环 -数组的长度作为数组中的元素并检查每个 for 循环 if(array[2]==FN){//save the value to a variable},与其他参数相同。但是这里的第一个问题是我会有很多混乱的不清楚的代码,另一个问题是:我只需要变量中的值,有时我什至必须拆分它们,所以我有变量 FirstName 和 LastName 但是我保存在数组中的是 FN: John Doe,我需要的是将 FirstName 设置为 John,将 LastName 设置为 Doe。

有人知道一个紧凑、清晰且可维护的解决方案吗?

感谢您的帮助!

编辑:

我现在尝试的(Mathieu 的解决方案)如下:

var aliases =
            {
              '/FN/i':'name',
              '/TITLE/i':'jobtitle',
              '/ORG/i':'accname',
              '/EMAIL;WORK;INTERNET/i':'mail',
              '/EMAIL;TYPE=INTERNET/i':'mail',
              '/EMAIL;INTERNET/i':'mail',
              '/EMAIL/i':'mail',
              '/TEL;WORK;VOICE/i':'phone',
              '/TEL;TYPE=voice,work,pref/i':'phone',
              '/TEL;TYPE=voice,work/i':'phone',
              '/TEL;WORK/i':'phone',
              '/TEL:TYPE=work/i':'phone',
              '/TEL;CELL/i':'mobile',
              '/TEL;TYPE=voice,cell,pref/i':'mobile',
              '/TEL;TYPE=voice,cell/i':'mobile',
              '/TEL;TYPE=cell/i':'mobile',
              '/ADDR/i':'address'
            };

            var idx;
            var out={}, i, ci = fields.length;
            for(i=0;i<ci;i++) // 1
                for(idx in aliases) // 2
                    if(aliases.hasOwnProperty(idx)) // 3
                        if(fields[i].search(eval(idx)) >= 0) // 4
                             out[aliases[idx]] = fields[i].substring(fields[i].indexOf(':')+1); // 5

            //document.write(JSON.stringify(out));

            alert(out['accname']);

但是我在alert中得到的是完整的二维码内容... 有什么想法吗?

编辑2: 现在工作,在取回我的阵列时犯了一个小错误。谢谢。

我认为像这样的东西可以解决问题。

<script>
var vcard = ['BEGIN:VCARD','VERSION: 3.0','FN: John Doe','url: www.google.de', 'TEL TYPE=work, CHARSET=UTF-8: 0123466','title: ceo' ];

// Define here filters for the fields you want
var aliases = 
{
  '/tel/i':'Tel',
  '/work/i':'Tel',
  '/FN/i':'Name',
};

var out={}, i, ci = vcard.length;
for(i=0;i<ci;i++) // 1
  for(idx in aliases) // 2
    if(aliases.hasOwnProperty(idx)) // 3
      if(vcard[i].search(eval(idx)) >= 0) // 4
        out[aliases[idx]] = vcard[i].substring(vcard[i].indexOf(':')+1); // 5

document.write(JSON.stringify(out));

</script>