JavaScript:推送到具有未知键名称的数组

时间:2012-09-25 10:47:49

标签: javascript

我有一个小程序返回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 = ??????”

3 个答案:

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

希望它有所帮助。