将多个对象属性值连接成一个

时间:2016-08-03 21:38:03

标签: javascript concat string-concatenation

如果我有以下结构的对象:

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

假设属性名称是固定的而不是总是按此顺序排列,那么将此对象转换为以下对象的最佳方式是什么:

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

4 个答案:

答案 0 :(得分:1)

我认为没有任何特别优雅的方法可以做到这一点。

由于您的输入数据只有少量固定键,因此使用循环几乎没有任何意义,因此可行:

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

答案 1 :(得分: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(test,1)会给你答案,但它会为变量保留相同的属性名称。如果要更改实际属性名称,则需要某种映射功能(例如:从property1到prop1copy)

这会将属性#转换为属性#copy:

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];
        }
    }
}

答案 2 :(得分: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;
}

希望这有帮助

答案 3 :(得分: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;
}
  • 假设您希望按字母顺序排列连接属性, 以上会奏效。如果没有,那么你需要指定一个 不同的排序顺序。如果它会发生变化,这可以作为参数传递。
  • 如果复制属性会发生变化,则此代码可能还需要更改。此外,可以作为参数传递的东西 - 如果它只是索引,则是微不足道的,但是如果你必须按名称查找它们(例如,如果你想说&#34; prop1&#34;无论如何它的位置,你还需要实现它。)
  • 如果名称 propConcat prop1Copy 需要变化多于此,则需要实现逻辑。或传递的值......
  • 没有验证。为了这个例子我保持简单,但是一些错误处理会很好。

老实说,如果您的预期输出 的变化不止一件事,例如,如果您需要复制属性不同且排序顺序不同,那么它可能只是更好地废弃这个功能。如果您需要传递大部分内容来构建结果,那么预期输入/输出的大变化会使它变得有点笨拙。