2012-09-25 29 views
1

我有一个小程序,返回JSON,然后在将它推入数组之前进行询问。JavaScript:推送到未知键名的阵列

的数据的例子如下:

ID = 1 |业主=维娜圣佩德罗|名优产品= 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 }); 
            }); 
           }); 

在上面的例子,如果我的|分隔字符串包含“Owner = ?????? | Value = ???????? | Brand = ???????”那么当我将它推入数组时,我希望这些键是“所有者”,“价值”和“品牌”。

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

+1

的数据看起来就像你的榜样?这甚至几乎没有JSON格式! – Jamiec

+0

没错,但我从来没有说过这是JSON数据,我说我在审讯前返回JSON数据 - 上面的数据是在审讯之后。 – JasonMHirst

+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 - 看到控制台输出

+0

是的,看看你的意思是什么,现在你已经证明了这一点,正是我所追求的。感谢您向我展示了一个更好的方式。 – JasonMHirst

+0

看到[this](http://jsfiddle.net/KSsFA/2/)js小提琴 - 我更新了你的代码,所以它的工作正确。当你决定迭代'.split(“=”)'的结果时,你犯了一个错误。在你的代码中,你一次只能得到一个结果。 –

0

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

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

希望它有帮助。

+0

不要这样做!它不是用索引创建数组。这在JavaScript中不存在。它将被转换为一个对象。试试'sample.length'来看看它带来了什么样的可能性。 –

+0

@DanLee - 它不会被转换成对象:在JS中,数组_is_是一种对象类型,可以同时具有数字索引属性和命名属性。但是你确定数组在这里不是合适的结构,它应该是一个“普通”对象,就像'var sample = {};'。 – nnnnnn

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... 

该代码进行测试和工作

+0

真棒解释,谢谢! – JasonMHirst

+0

@JasonMHirst:很高兴帮助。我不经常这样做,但我强烈建议使用这种方法?已批准的答案构造一个对象,分割一个字符串(调用'Array'构造函数)并迭代该数组,仅在_every_元素上再次调用'Array'构造函数。它还使用了大量额外的变量(这增加了意外全局变量的风险)_并且它不处理字符串中的最后一个'|',也创建了一个无名的'undefined'属性。我不想吹嘘或吹嘘,但我确信我的解决方案是更好的解决方案 –