1

我有一个返回 JSON 的小程序,然后在将其推入数组之前对其进行询问。

数据示例如下:

id=1|owner=Vina San Pedro|brandName=1865 智利葡萄酒|variantName=1865 智利葡萄酒|quality=Standard|minorRegionName=北欧国家|vol02=0|vol07=0|vol08=4.25|vol09=4.25|vol10=0 |

我可以迭代上面的字符串,将值推送到数组中,但是考虑到诸如“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 });
                                    });
                                });

在上面的例子中,如果我的 | 分隔符字符串包含“所有者=??????|值=????????|品牌=???????” 然后当我将它推入一个数组时,我希望键是“所有者”、“价值”和“品牌”。

但是,直到我返回数据后我才知道键名,所以有时 | 分隔字符串可以是“所有者=??????|Line=???????|Region=??????”

4

3 回答 3

1

首先:你不是在寻找一个数组,而是一个对象。JS 数组实际上是拖拽中的对象,但这不是重点;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...

此代码经过测试并且可以正常工作

于 2012-09-25T11:27:05.650 回答
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 演示- 查看控制台输出

于 2012-09-25T11:03:33.120 回答
0

您可以使用字符串来命名密钥。例如。

var sample = new Array();
sample["bob"] = 123;
sample.bob; //returns 123

希望能帮助到你。

于 2012-09-25T10:51:46.890 回答