我有一个小程序返回JSON,然后在将其推入数组之前进行询问。
数据的一个例子如下:
id = 1 | owner = Vina San Pedro | brandName = 1865智利葡萄酒| variantName = 1865智利葡萄酒|质量=标准| minorRegionName =北欧国家| vol02 = 0 | vol07 = 0 | vol08 = 4.25 | vol09 = 4.25 | vol10 = 0 |
我可以迭代上面的字符串,将值推送到数组中,但是如何根据JSON中的字段名称“命名”数组中的键,考虑到诸如“Vol02”,“Vol07”之类的项目可能被标记为“val02”,“val07”或“minorRegionName”在某些情况下可以被“majorRegionName”标记。
修改的
var finalSplit = brandDataRow.split('|');
$.each(finalSplit, function (x, y) {
var v = y.split('=');
$.each(v, function (m, n) {
formattedBrandData.push({ m: m }, { n: n });
});
});
在上面的例子中,如果我的| delimiterred字符串包含“Owner = ?????? | Value = ???????? | Brand = ???????”然后,当我将其推入数组时,我希望键是“所有者”,“价值”和“品牌”。
但是,在我返回数据之前,我不知道关键名称,所以有时候|分隔字符串可以是“Owner = ?????? | Line = ??????? | Region = ??????”
答案 0 :(得分:1)
试试这个:
var data = "id=1|owner=Vina San Pedro|brandName=1865 Chilean Wine|variantName=1865 Chilean Wine|quality=Standard|minorRegionName=Nordic Countries|vol02=0|vol07=0|vol08=4.25|vol09=4.25|vol10=0|";
var keyVal = data.split("|");
var res = {};
for(var i =0; i< keyVal.length; i++) {
var tmp = keyVal[i].split("=")
res[tmp[0]] = tmp[1];
}
console.log(res);
是的,它将返回一个对象,但数组只能包含数字索引。在大多数情况下,您可以使用与数组相同的方式处理对象。此外,没有理由使用$ .each来完成这么简单的任务。只需执行一个额外的代码。
JSFiddle demo - 请参阅控制台输出
答案 1 :(得分:1)
首先关闭:你不是在寻找一个数组,而是一个对象。 JS Arrays实际上是拖动对象,但这不是重点; JS没有关联数组,只有对象。但回答你的问题:IMO,你可以将字符串转换为对象的最简单(也是我怀疑,最快)的方法是将它转换为有效的JSON:
var str = 'id=1|owner=Vina San Pedro|brandName=1865 Chilean Wine|variantName=1865 Chilean Wine|quality=Standard|minorRegionName=Nordic Countries|vol02=0|vol07=0|vol08=4.25|vol09=4.25|vol10=0|';
var obj = JSON.parse('{"'+str.substring(0,str.length-1).replace(/(=|\|)/g,function(s1,s2)
{
return '"'+(s2 === '=' ? ':' : ',')+'"';
})+'"}');
这是密集版本,如果我们将其分解:
str.substring(0,str.length-1);//leave out trailing pipe (|)
//if the pipe is not always there:
str = str.substr(-1) === '|' ? str.substring(0,str.length-1) : str;
然后替换所有=
和|
:
str = str.replace(/(=|\|)/g,function(s1,s2)
{//s1 will be the entire matched substring, s2 the first group, not required in this case, but just so you know
return '"'+(s2 === '=' ? ':' : ',') + '"';
});//pipes become comma's, = becomes colon
我们现在几乎就在那里,返回的字符串将是id":"1","owner":"Vina San Pedro","brandName":"1865 Chilean Wine","variantName":"1865 Chilean Wine","quality":"Standard","minorRegionName":"Nordic Countries","vol02":"0","vol07":"0","vol08":"4.25","vol09":"4.25","vol10":"0
。正如您所看到的,我们需要添加的是开始和结束的卷曲,以及字符串开头和结尾的双引号,最后我们得到了有效的JSON:
var obj = JSON.parse('{"'+str+'"}');//returns object
//is the same as:
obj = { brandName: "1865 Chilean Wine",
id: "1",
minorRegionName: "Nordic Countries",
owner: "Vina San Pedro",
quality: "Standard",
variantName: "1865 Chilean Wine",
vol02: "0",
vol07: "0",
vol08: "4.25",
vol09: "4.25",
vol10: "0"};
从那时起:
console.log(obj.id);//logs 1
console.log(obj.owner);//logs 'Vina San Pedro'
console.log(obj['brandName']);//string access: logs "1865 Chilean Wine"
//etc...
此代码已经过测试并正常运行
答案 2 :(得分:0)
您可以使用字符串来命名密钥。 例如
var sample = new Array();
sample["bob"] = 123;
sample.bob; //returns 123
希望它有所帮助。