2016-08-03 63 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复制需要变化多于此,逻辑需要实施。或者传入的值...
  • 没有验证。为了这个例子,我保持简单,但是一些错误处理会很好。

说实话,如果你的预期输出会超过一两件事改变,例如,如果你需要复制属性有所不同,排列顺序是不同的,那么它可能只是更好地废除这个功能。如果您需要传递大部分内容来构造结果,预期输入/输出的大变化会使其有点笨拙。

相关问题