2016-08-03 33 views
0

如果我有以下結構對象:連接多個對象的屬性值代入一個

var test = { 
    property1: "value1", 
    property2: "value2", 
    property3: "value3", 
    property4: "value4", 
    property5: "value5" 
} 

假設屬性名稱是固定的,在此爲了不總是,什麼是這個對象轉換成以下最優雅的方式一個:

var test_copy = { 
    prop1Copy: "value1", 
    propConcat: "value2, value3, value4, value5" 
} 
+1

「prop1Copy」的名字是怎麼產生的?而且,你怎麼知道它有什麼價值?請記住,大部分時間屬性都沒有給他們訂單。 – jfriend00

+0

prop1複製總是通過以特定順序共同擁有property2,property3,property4和property5的值來生成 –

+0

屬性通常不會有任何順序。我在問如何生成實際的屬性名稱'prop1Copy'?這只是一個硬連接的屬性名稱嗎? – jfriend00

回答

1

我不認爲有任何特別優雅的方式來做到這一點。

由於輸入數據有一個小的固定數字鍵有勉強使用循環的任何一點,所以此工程:

function munge(o) { 
    return { 
     prop1Copy: o.property1, 
     propConcat: [o.property2, o.property3, o.property4, o.property5].join(', ') 
    } 
} 
+0

謝謝!這正是我所期待的。只要鍵是固定的,並沒有很多這是最簡單的連接值的方式 –

+1

假設您只有5個屬性。 – Redu

0

試試這個:

function concatObject(object, levels){ 
    var currentLevel = 0; 
    var newObj = {propConcat: ""}; 
    for(var prop in object){ 
     if(currentLevel < levels){ 
      newObj[prop] = object[prop]; 
     } 
     else{ 
      newObj["propConcat"] += object[prop]; 
     } 
    } 
} 

concatObject(測試1)將給你答案,但它會保持變量的屬性名稱相同。如果你想改變實際的屬性名稱(例如:從property1到prop1copy)你需要某種映射功能

這將改變屬性#財產#複製:

function concatObject(object, levels){ 
    var currentLevel = 0; 
    var newObj = {propConcat: ""}; 
    for(var prop in object){ 
     if(currentLevel < levels){ 
      newObj[prop+"copy"] = object[prop]; 
     } 
     else{ 
      newObj["propConcat"] += object[prop]; 
     } 
    } 
} 
0

林不知道你需要在這裏完成。但是如果你想複製第一個項目並且連接所有其他的請看這個。

function concatValues (obj) { 
    var resObj = {prop1Copy: ""}, count = 0, mergedArr = []; 
    for (var k in obj) { 
     count == 0 ? resObj.prop1Copy = obj[k] : mergedArr.push(obj[k]); 
     count++; 
    } 
    resObj.propConcat = mergedArr.join(", "); 
    return resObj; 
} 

希望這有助於

0

這裏是一個更通用的解決方案,將在更大範圍的輸入的工作有一些注意事項

function concatenateObjectValues(obj) { 
    //If you want the output to be sorted differently, you need to provide your own sort order. This sorts by alphabetical order 
    var keys = Object.keys(test).sort(); 

    //assuming the first property would always be the copy 
    //removing the first element and returning it 
    var copyProp = keys.unshift(); 

    //generate an array that has the values of the remaining properties from the input 
    var concatProp = keys.reduce(function(memo, key) { 
     memo.push(test[key]); 
     return memo; 
    }, []); 

    //create `propConcat` and combine the values using the specified separator 
    var newObj = { 
     propConcat: concatProp.join(", ") 
    }; 

    //add the `prop1Copy` property. The first part of the name would be derived from the actual first property . 
    newObj[copyProp + "Copy"] = obj[copyProp]; 

    return newObj; 
} 
  • 假設你想以字母順序串聯的性質, 以上會工作。如果沒有,那麼你需要指定一個 不同的排序順序。這可以作爲參數傳遞,如果它會變化的話)。
  • 如果複製屬性會變化,那麼這個代碼可能也需要改變。此外,可以作爲參數傳入的內容 - 如果它只是索引,則不重要,但如果您必須按名稱查看它們(例如,如果要說「prop1」而不管它在哪裏),則需要也執行那個)。
  • 如果名稱爲propConcatprop1複製需要變化多於此,邏輯需要實施。或者傳入的值...
  • 沒有驗證。爲了這個例子,我保持簡單,但是一些錯誤處理會很好。

說實話,如果你的預期輸出會超過一兩件事改變,例如,如果你需要複製屬性有所不同,排列順序是不同的,那麼它可能只是更好地廢除這個功能。如果您需要傳遞大部分內容來構造結果,預期輸入/輸出的大變化會使其有點笨拙。

相關問題