将数组值(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;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']);
但是我在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>
我有以下问题:
(后面的都需要用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;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']);
但是我在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>