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

时间:2015-04-09 08:18:22

标签: javascript arrays sorting vcard

我有以下问题:

(以下所有内容,需要在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

等等。现在的问题是,有两个(或更多版本和种类)attributs的外观,例如。工作电话可以看起来像:TEL;WORK;VOICETEL;WORK;或TELTEL;TYPE=voice,workTEL; 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']);

但我在警报中得到的是qr代码的完整内容...... 任何想法为什么?

EDIT2: 现在工作,有点错误让我的阵列恢复。谢谢。

1 个答案:

答案 0 :(得分:1)

这样的事情我会想到这个技巧。

<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>