2015-12-09 26 views
3

如果我有兩個對象。如何使用第一個值的第一個對象作爲關鍵字填充第一個對象?說對於下面的例子,我需要第一個對象來包含第二個對象的所有項目,它們的顏色與第一個對象的顏色相同。合併兩個多維對象(如果它們在javascript中具有相同的鍵值)

object1 = { 
    1:{ 
    name:'bed', 
    color:'blue' 
    } 
} 


object2 = { 
    1:{ 
    name:'chair', 
    color:'blue' 
    }, 

    2:{ 
    name:'table', 
    color:'red' 
    } 
} 

所以這將導致

object1 = { 

    1:{ 
    name:'bed', 
    color:'blue' 
    }, 

    2:{ 
    name:'chair', 
    color:'blue' 
    } 

} 
+1

只是爲了澄清,你說你想從第二個對象擴大與項目的第一個對象,只有當他們具有相同的顏色? –

+0

@realseanp對不起,如果這很混亂,英語不是我的第一語言。 – Suavocado

+0

還有一個問題:object1和object2應該是數組還是對象? – unpollito

回答

1

這是另一種解決方案,它從第二個對象中獲取所有對象,並使用第一個對象中任何對象中存在的顏色。

請記住,對象是通過引用傳遞的,所以你在這裏使用淺拷貝。

對這些列表使用對象而不是數組會產生一些關鍵衝突頭痛,但通過手動建立索引來解決。

請注意,您的顏色列表可以更好地用作散列圖,而不是Array,這可以降低較長列表中的複雜性。

function colorMap (obj) { 
 
    var map = {}; 
 
    
 
    Object.keys(obj).forEach(function (key) { 
 
    map[obj[key].color] = true; 
 
    }); 
 
    
 
    return map; 
 
} 
 

 
function merge (one, two) { 
 
    var map = colorMap(one), 
 
     index = Object.keys(one).length; 
 
    
 
    Object.keys(two).forEach(function (key) { 
 
    if (map[two[key].color]) one[++index] = two[key]; 
 
    }); 
 
    
 
    return one; 
 
} 
 

 
// 
 

 
var object1 = { 
 
    1:{ 
 
    name:'bed', 
 
    color:'blue' 
 
    } 
 
}, 
 

 
object2 = { 
 
    1:{ 
 
    name:'chair', 
 
    color:'blue' 
 
    }, 
 

 
    2:{ 
 
    name:'table', 
 
    color:'red' 
 
    } 
 
}; 
 

 

 
console.log(merge(object1, object2));

1

那麼這裏是你可以做的。您可以指定要匹配其鍵和值..

var object1 = { 
    1:{ 
    name:'bed', 
    color:'blue' 
    } 
}; 


var object2 = { 
    1:{ 
    name:'chair', 
    color:'blue' 
    }, 

    2:{ 
    name:'table', 
    color:'red' 
    } 
}; 

// a - object1 
// b - object2 
// key - key you want to match 
// value - value of key that must be matched 
var mergeSameValue = function(a, b, key, value){ 
    var count = 1; 
    for(var c in a){ 
    if(a.hasOwnProperty(c)){ 
     count ++; 
    } 
    } 
    for(var i in b){ 
    if(b[i][key] === value){ 
     a[count] = b[i] 
     count ++; 
    } 
    } 
    return a 
}; 

// Your new object with both objects merged 
var newObj = mergeSameValue(object1, object2, 'color', 'blue'); 
+0

適合我需要的東西,看起來非常優雅,感謝您花時間。 – Suavocado

+0

我不確定這是什麼suavocado想要的。他想要複製所有項目「與任何第一個對象具有相同的顏色」。從這裏我可以得知object1中可能有多個項目,它們可能有不同的顏色;在這種情況下,您需要多次調用mergeSameValue作爲對象的次數。 – unpollito

2
// Store all the colours in object1 inside an array 
var colours = []; 
var object1_keys = Object.keys(object1); 
object1_keys.map(function(key) 
{ 
    if (colours.indexOf(object1[key].color) === -1) 
    { 
     colours.push(object1[key].color); 
    } 
}); 

var last_index = object1_keys.length; 

// Copy all the items from object2 into object1 if their colour 
// is inside the colours array 
var object2_keys = Object.keys(object2); 
object2_keys.map(function(key) 
{ 
    if (colours.indexOf(object2[key].color) > -1) 
    { 
     last_index++; 
     object1[last_index] = object2[key]; 
    } 
}); 

既然你沒有一個陣列,但陣列狀指數的對象,我使用一個變量叫「last_index」知道我們需要爲object1中的新項目設置的索引。如果你正在使用數組,邏輯將會更簡單。

編輯:我的解決方案和realsenanp的主要區別是,他正在合併只有一種顏色的項目。如果object1中有多種顏色,我提出的解決方案可能會更有效率。

相關問題