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

Concatenate multiple object property values into one

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

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

假设 属性 名称是固定的并且并不总是按此顺序,将此对象转换为以下对象的最优雅方法是什么:

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

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

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

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

试试这个:

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) 会给你答案,但它会为变量保留相同的 属性 名称。如果您想更改实际的 属性 名称(例如:从 属性1 到 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];
        }
    }
}

我不确定您需要在这里完成什么。但是如果你想复制第一个项目并连接所有其他项目,请看一下这个。

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

希望对您有所帮助

这是一个更通用的解决方案,适用于更广泛的输入但有一些注意事项

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" 不管它在哪里,你还需要实施)。
  • 如果名称 propConcatprop1Copy 需要变化更多,则需要实现逻辑。或者传入的值...
  • 没有验证。为了示例的缘故,我保持简单,但一些错误处理会很好。

老实说,如果您的预期输出 会发生不止一件事的变化,例如,如果您需要副本 属性 不同并且排序顺序不同,那么最好取消此功能。如果您需要传入大部分内容来构建结果,那么预期 input/output 的巨大变化会使它变得有点笨拙。