2012-12-07 116 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

对不起,我正忙着输入代码,并没有看你的答案。关于$。每个,是的,我同意 –