2012-12-07 114 views
3

我有對象的兩個數組:創建陣列,其中密鑰匹配

var arOne = [ 
    {key: 'alpha', value: 5}, 
    {key: 'beta', value: 11}, 
    {key: 'gamma', value: 15}, 
    {key: 'delta', value: 12}, 
    {key: 'epsilon', value: 55} 
    {key: 'pony', value: 101} 
] 

var arTwo = [ 
    {key: 'alpha', value: 5.5}, 
    {key: 'beta', value: 11.5}, 
    {key: 'gamma', value: 15.5}, 
    {key: 'psi', value: 12.5}, 
    {key: 'omega', value: 55.5} 
] 

我需要值合併到陣列中的一個陣列。

密鑰匹配的情況:使用密鑰創建一個數組,並將值從arTwo附加到arOne

密鑰不匹配的情況:如果密鑰存在於arOne中,我包含的值爲arOne,0和arTwo。如果密鑰存在於arTwo中,我包含的0和arTwo的值。

請注意,arOnearTwo可能會有不同的尺寸(請參閱arOne中的pony密鑰)。

這是結果應該是什麼樣子:

var result = [ 
    ['alpha', 5, 5.5], 
    ['beta', 11, 11.5], 
    ['gamma', 15, 15.5], 
    ['delta', 12, 0], 
    ['epsilon', 55, 0], 
    ['pony', 101, 0], 
    ['psi', 0, 12.5], 
    ['omega', 0, 55.5], 
] 

我在這一天都一直盯着,劃傷了我所有的嘗試。有什麼想法嗎?

+0

嵌套for循環! – thatidiotguy

+2

你有什麼嘗試?我會建議兩個循環,一個循環遍歷第一個數組並填充'result',另一個循環遍歷第二個循環,並將新條目添加到'result'。 – Blazemonger

+0

我試過$ .each(),因爲這些數組的大小不同,所以無法工作。我嘗試了一個嵌套for循環,但無法弄清楚如何訪問對象中的值。我希望jQuery有一個半優雅的解決方案,但可能不是。 –

回答

2
function combine(obj1, obj2){ 
    var arr = [], k, i; 
    for (k = 0; k < obj1.length; ++k){ 
     arr.push([obj1[k].key, obj1[k].value]); 
    } 
    for (k = 0; k < obj2.length; ++k){ 
     var exists = false; 
     for (i = 0; i < arr.length; ++i){ 
      if(arr[i][0] === obj2[k].key){ 
       arr[i].push(obj2[k].value); 
       var exists = true; 
       break; 
      } 
     } 
     if (!exists){ 
      arr.push([obj2[k].key, 0, obj2[k].value]); 
     } 
    } 
    for (i = 0; i < arr.length; ++i){ 
     if (arr[i].length === 2){ 
      arr[i].push(0); 
     } 
    } 

    return arr; 
} 

調用,比如:

var myNewArray = combine(arOne, arTwo); 
+0

這不起作用。它不會給OP所希望的缺失值提供'0'。對我感到羞恥。我將編輯。 –

+0

我可能會誤解,但是我看到它的第一個循環將索引'k'推入數組而不是值'obj1 [k] .key'。 – Mathias

+0

你必須考慮他要求合併到全部對象的數組。 – Mathias

1

下面是簡單的取就可以了。您遍歷第一個數組並將數據推送到結果數組中。當你循環播放第二張時有點棘手。您獲取每個鍵值對並檢查結果數組中是否存在該鍵。如果是這樣,添加它,如果沒有(發現= false)將其添加到結果數組:

var result = []; 
var i; 

for (i = 0; i < arOne.length; i++) { 
    result.push([ arOne[ i ].key, arOne[ i ].value ]); 
} 

for (i = 0; i < arTwo.length; i++) { 
    var key = arTwo[ i ].key; 
    var value = arTwo[ i ].value; 
    var found = false; 

    for (var k = 0; k < result.length; k++) { 
     if (result[ k ][ 0 ] === key) { 
      result[ k ].push(value); 
      found = true; 
     } 
    } 

    if (! found) { 
     result.push([ key, value ]); 
    } 

} 

結果是您想要的數組。可能不是最有效的方法。但它完成了工作。

此外,在一張小紙條。你可能想考慮使用和對象而不是嵌套數組。 讓你的結果看起來是這樣的:

var result = { 
    alpha: [5, 5.5], 
    beta: [11, 11.5], 
    gamma: [15, 15.5], 
    delta: [12, 0], 
    epsilon: [55, 0], 
    pony: [101, 0], 
    psi: [0, 12.5], 
    omega: [0, 55.5], 
} 

這可能是更容易在後面的代碼來處理你的數據。

+0

感謝您的回覆。 –

1

確定..我管理它

var tmp_result = {}; // we need this object to make things easy 
var result = []; 

// add all elements in first array to result, im using this as an object so that I can easily find the keys later 
$.each(arOne, function (index, element) { 
    tmp_result[element.key] = [element.key, element.value]; 
}); 


// loop through second array  
$.each(arTwo, function (index, element) { 
    // check if this was key already added 
    if (tmp_result[element.key] != undefined) { 
     // if it was added earlier then add the new key 
     tmp_result[element.key].push(element.value); 
    } else { 
     // create a new key, add 0 in between since its not there in first array 
     tmp_result[element.key] = [element.key, 0, element.value]; 
    } 
}); 

// now we are left with all those elements which are in first array but not in second 
$.each(tmp_result, function (key, element) { 
    // check if the array has 3 elements, if not then add 0 in the end since its not there in second one 
    if (element.length < 3) element.push(0); 
    // pass the flattened out data to result array 
    result.push(element); 
}); 

console.log(result); 

小提琴 - http://jsfiddle.net/atif089/McfUk/

我的產量

[ 
    ["alpha", 5, 5.5], 
    ["beta", 11, 11.5], 
    ["gamma", 15, 15.5], 
    ["delta", 12, 0], 
    ["epsilon", 55, 0], 
    ["pony", 101, 0], 
    ["psi", 0, 12.5], 
    ["omega", 0, 55.5] 
] 
+0

這是我的答案的副本...除了你創建一個對象,然後將對象推到一個數組。使用jQuery(或任何庫)來實現功能簡單,如果沒有它們,也很容易實現。 –

+1

對不起,我正忙着輸入代碼,並沒有看你的答案。關於$。每個,是的,我同意 –