2017-06-17 51 views
0

我現在有一個情況我有2個物體看起來像這樣的:Javascript:如何輕鬆地用第二個對象的數據替換對象值?

object a = {n: 15, b: 12, v: 10, h: 9} and so on. 
object b = {1: e, 2: b, 3: z, 4: w} and so on. 

我需要從對象B採用的值,並使用這些對象來代替值。結果會是什麼樣子:

object c = {n: e, b: b, v: z} etc. 

一個重要的事情是,如果在對象的更多條b比對象,我仍然需要它們添加到對象C的結束。所以如果對象b中還有3個項目,最後可能會發生類似{24:a,25:y,26:w}的事情。

當然,我首先想到的是一個循環,我將遍歷對象a中的每個項目,並用對象b中的值替換'值'。但我不知道是否有更好的方法,尤其是考慮到確保來自對象b的所有項目都包含在新對象中。

由於這種擔心,替代方案可能是將對象b中的鍵替換爲對象a中的鍵。這樣,如果對象a耗盡,對象b中的最後一項不會被排除。

我也試過:

Object.assign(a, b); 

但只有當密鑰是相同的工作,所以這是行不通的。我需要任何匹配索引來索引這兩個對象。

如果很重要,我可以將對象b更改爲任何我想要的,因爲它是靜態的。所以,我可以這樣做:

object b = [e, b, z] etc. or 
object b = {e: e, b: b, z: z} 

無論什麼最容易做到。

我很欣賞任何人可能有的想法,或者如果你可以指向一個好的職位,包括像這樣的東西的方向。我目前正在淘網上嘗試任何聽起來像可能會發揮作用的東西,但到目前爲止,沒有什麼適合的。

另外值得注意的是,在這一點上,我使用純香草JS,所以如果有一個庫或其他東西可以使這個超級簡單,我願意。

+0

例如,對象b {1:e,2:b,3:z,4:w}中的某些值是b,z並且是字符串類型還是變量? –

+1

由於JS不保證對象中的屬性順序,因此您的問題基本上不能很好地指定。 – 2017-06-17 03:49:42

回答

1

你可以做類似下面

var objectA = { 
    b: "test", 
    a: "test2", 
    c: "test3", 
    d: "test4" 
}; 

var objectB = ["new", "new2", "new3", "new4", "new5", "new6"]; 
var index = 0; 

for (var prop in objectA) { 
    if (objectA.hasOwnProperty(prop)) { 
    objectA[prop] = objectB[index]; 
    index++; 
    } 
} 

for(index; index < objectB.length; index++) { 
    objectA[index] = objectB[index]; 
} 

夫婦的事情,但:

  1. for..in循環的基礎上實現的順序。所以無論順序屬性添加到對象將是循環的順序。
  2. 像你正在請求的功能似乎是一個代碼的氣味,當脫離上下文查看。通常情況下,您並未像您請求的方式合併兩個對象。如果你想提供進一步的背景,可以提供更好的解決方案。
+0

他想要的是對象,而不是數組。 –

1

我假設對象b中的那些字母值是字符串,但該示例也適用於變量,您只需刪除引號即可。

我的方法是: 1.獲取b和a中的所有密鑰2。創建一個空對象,循環遍歷b中的鍵3.使用b的索引,我也可以得到a的索引。這樣,當我們第三次迭代時,我會是2,我可以得到a和b的鍵和值,分別是v:10和3:'z'。然後我把a的鍵映射到b的值,所以結果是v:'z'。 4.如果b有更多的鍵,只需將b中的當前鍵和值分配給c。

var a = {n: 15, b: 12, v: 10, h: 9}; 
 
var b = {1: 'e', 2: 'b', 3: 'z', 4: 'w', 24: 'a', 25: 'y', 26:'w'}; 
 

 
// get all the keys in a 
 
let aKeys = Object.keys(a); 
 

 
// get all the keys in b 
 
let bKeys = Object.keys(b); 
 

 
// acc is the accumulated object c, 
 
// at the beginning value of c is {}, it gets bigger as we loop through the keys of b 
 
// i is the ith key in b 
 
let c = bKeys.reduce((acc, _, i) => { 
 
    // if a > b then put key value pair of b 
 
    if (i > aKeys.length - 1) { 
 
    acc[bKeys[i]] = b[bKeys[i]]; 
 
    } else { 
 
    acc[aKeys[i]] = b[bKeys[i]]; 
 
    } 
 
    return acc; 
 
}, {}); 
 

 
console.log(c)

+1

這個解決方案取決於'a'中的鍵的順序,JS不保證給你。 – 2017-06-17 03:51:16

0

做多一點的搜索和播放後,這是我讀啓發了我,使這兩個對象到數組來代替,然後他們加入到地圖中。結束了超級簡單。結果如下:

var a = ['a', 'b', 'c']; 
var b = [1, 2, 3]; 
var map = {}; 
for(var i = 0; i < a.length; i += 1) { 
    map[ a[i] ] = b[i]; 
} 

console.log(map); // {a: 1, b: 2, c: 3} 

感謝您的閱讀!

+0

他想要的對象,而不是數組。 –

+0

@永泉 - 注意這個答案是由OP發佈的。 – nnnnnn

+0

@nnnnnn哦,男孩... –

0
var objectA = {n: 15, b: 12, v: 10, h: 9}; 
var objectB = {n: e, b: b, v: z, h: w, a: 1, c: 2}; 
var objectC = extend({}, objectA, objectB); 

function extend(out){ 
    out = out || {}; 
    for (var i = 1, len = arguments.length; i < len; i++){ 
     var obj = arguments[i]; 
     if (!obj) continue; 
     for (var key in obj){ 
      if (obj.hasOwnProperty(key)) 
       out[key] = (typeof obj[key] === 'object') ? extend(out[key], obj[key]) 
                  : obj[key]; 
     } 
    } 
    return out; 
} 

console.log(objectC); 
// outputs {n: e, b: b, v: z, h: w, a: 1, c: 2} 

如果ebz,沒有定義w它會拋出錯誤。

objectAobjectB的值保持不變。

extend({}, objectA, objectB),從objectB得到值來代替objectA,然後objectA{}不改變objectAobjectB原始值。

注意:您需要更改按鍵的objectB反映鍵在objectA而不是使用123 ......作爲鍵。

相關問題