2010-05-12 125 views
2

我有3個JSON陣列,每個具有以相同的格式列出的信息:結合JSON陣列

Array: 
    ID: 
    NAME: 
    DATA: 

    ID: 
    NAME: 
    DATA: 

    etc... 

我的目標是通過將3至所有3個陣列組合成一個陣列,並且通過名稱排序和顯示數組轉換成函數。

我已經試過的功能是:

JavaScript調用:

// to save time I'm just passing the name of the array, I've tried passing 
// the full array name as json[0]['DATA'][array_1][0]['NAME'] as well. 

combineNames(['array_1','array_2']); 

功能:以上

function combineNames(names) { 

    var allNames = [] 

    for (i=0;i<names.length;i++) { 
     for (j=0;j<json[0]['DATA'][names[i]].length;j++) { 
      allNames.push(json[0]['DATA'][names[i]][j]['NAME']); 
     } 
    } 

    return allNames.sort(); 
} 

給我的錯誤是名稱爲null或未定義。

我也使用array.concat功能,工作時嘗試我硬編碼:

var names = []; 
var allNames = []; 

var names = names.concat(json[0]['DATA']['array_1'],json[0]['DATA']['array_2']); 

for (i=0;i<names.length;i++) { 
    allNames.push(names[i]['NAME']); 
} 

return allNames.sort(); 

但我無法弄清楚如何在數組傳遞到函數(如果可能的話我想只傳遞數組名稱部分,而不是整個json [0] ['DATA'] ['array_name'],就像我試圖在第一個函數中做的那樣...

+1

你有JSON陣列? 它看起來像JSON中的一個畸形。 – CodeJoust 2010-05-12 19:26:23

+0

不幸的是,陣列中的數據不是我的分享,所以我只能給出結構。 – Choy 2010-05-12 19:35:05

+0

你可以改變數據或什麼?你讓我驚訝於這個結構是什麼。我正在沿着3個數組的行進行可視化,每個數組都包含如下內容:'[{「id」:1,「name」:「Bob」,「data」:1},{「id」:2, 「:」Fred「,」data「:2}]'。我在正確的軌道上嗎? – Matt 2010-05-12 19:59:11

回答

4

如果你有3個數組是這樣的:

[{ "id":1, "name":"Bob", "data":1},{ "id":2, "name":"Fred", "data":2 }] 

簡單地做:

function combine() { 
    var ar = []; 

    return ar.concat.apply(ar, arguments).sort(function (a, b) { 
     var aName = a.NAME; 
     var bName = b.NAME; 
     if (aName < bName) { 
      return -1; 
     } else if (aName == bName) { 
      return 0; 
     } else { 
      return 1; 
     }; 
    }); 
}; 

然後調用它像:

var jointArrays = combine(array1, array2, array3, ...); 

但是,如果你的JSON看起來像這樣:

json[0]['DATA'][array_1] 
json[0]['DATA'][array_2] 
json[0]['DATA'][array_3] 

你可以簡單地定義combine()如下,這將是更方便:

function combine(arrays) { 
    var ar = []; 

    return ar.concat.apply(ar, arrays).sort(function (a, b) { 
     var aName = a.NAME; 
     var bName = b.NAME; 
     if (aName < bName) { 
      return -1; 
     } else if (aName == bName) { 
      return 0; 
     } else { 
      return 1; 
     }; 
    }); 
}; 

然後調用它像:

var jointArrays = combine(json[0].DATA); 

如果你想只是名稱的數組,而不是物體,請使用以下內容:

function combine(arrays) { 
    var ar = [], 
     ret = []; 

    ar = ar.concat.apply(ar, arrays); 

    for (var i=0;i<ar.length;i++) { 
     ret.push(ar.NAME); 
    }; 

    return ret.sort(); 
}; 

Javascript is case sens itive;確保它是DATA而不是dataNAME而不是name

現在有一點家務。

在你的例子中,你的兩個計數器變量都被聲明爲「隱含的全局變量」,因爲你不用var語句(and implied globals are bad)作爲它們的前綴。您應該使用:

for (var i=0;i<something.length;i++) { 
    // 
}; 

而不是忽略var

另外, 「{}」 創建對象。 「[]」創建一個數組。 Javascript不支持關聯數組;例如數組的鍵除了數字之外都是其他鍵。你是JSON返回的是一個對象數組

「方形記號」和「點記法」是可以互換的。 object["one"]相當於object.one

當密鑰存儲爲變量或訪問數組時,通常使用方形表示法。

var key = "one"; 
object[key] 

希望這會有所幫助。

allNames(['array_1','array_2']); 

似乎工作:

+0

謝謝馬特。當你說它叫做array1,array2時,你的意思是完整的json [0] ['DATA'] ['array1']?當我這樣做,我得到[對象,對象] [對象,對象],等等... – Choy 2010-05-12 20:14:06

+0

@George:你應該這樣做:'結合(JSON [0] .DATA [array_one],JSON [0] .DATA [array_two ])',但請參閱我的編輯以獲得更好的解決方案('combine(json [0] .DATA)')。 – Matt 2010-05-12 20:21:43

+0

感謝您的幫助。特別是指出「房子清潔」的東西。我認爲你的功能只有一步之遙。我仍然得到[object,object],這可能只是對我的json數組的層次結構的誤解。無論如何,我原來的功能現在可以在@ _ @ – Choy 2010-05-12 20:45:42

0

您被重新聲明allNames變量,清空它。

試試這個:

function combineNames(names) { 
var allNames = []; 
var data = json[0]['DATA']; 
for (arrnames in data) { 
    for (j=0;j<data[arrnames].length;j++) { 
     if ('NAME' in data[arrnames]){ 
      allNames.push(data[arrnames]['NAME']); 
     } 
    } 
} 
return allNames.sort(); 
} 
+0

不知道我在哪裏重新聲明allNames var?我在代碼的for(j = 0; j Choy 2010-05-12 19:46:44

+0

好的......當您編寫'var names = [];'時,您重新聲明瞭名稱變量,它將覆蓋作爲空數組傳遞給函數的名稱數組。 – CodeJoust 2010-05-12 19:49:23

+0

哦,對,刪除它在我剛剛發佈的代碼中。雖然我的問題仍然是一樣的。當我通過註釋掉for循環來測試它並返回names.length時,我得到3(我傳入的數字或數組)。當我返回json [0] ['DATA'] [names [0]]。length時,我在第一個數組中得到了正確的名字數,當我返回json [0] ['DATA'] [names [0] ] [0] ['NAME']我在第一個數組中獲得名字。這是當我把它放在for循環中並嘗試返回allNames時,它被搞砸了。感謝您一直以來的幫助。 – Choy 2010-05-12 19:56:02

0
function allNames(names) { 

var allNames = []; 

for (var i=0;i<names.length;i++) { 
    for (var j=0;j<json[0]['DATA'][names[i]].length;j++) { 
     allNames.push(json[0]['DATA'][names[i]][j]['NAME']); 
    } 
} 

return allNames.sort(); 

} 

使用調用。

9

你可以用jQuery輕鬆組合JSON:

var x ={ a:1, b:2 }; 
var y ={ a:2, c:3 }; 
var z ={ b:3, d:4 }; 

$.extend(x, y, z); 

console.dir(x); // now 'x' is all of them combined