2012-09-25 24 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'屬性。我不想吹噓或吹噓,但我確信我的解決方案是更好的解決方案 –