我有以下问题:
(以下所有内容,需要在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;VOICE
或TEL;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']);
但我在警报中得到的是qr代码的完整内容...... 任何想法为什么?
EDIT2: 现在工作,有点错误让我的阵列恢复。谢谢。
答案 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>