【问题标题】:Concatenate multiple object property values into one将多个对象属性值连接为一个
【发布时间】:2016-12-09 19:01:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 名字prop1Copy是怎么生成的?而且,你怎么知道它得到了什么价值?请记住,大多数时候属性没有顺序。
  • prop1Copy 总是通过按特定顺序连接 property2、property3、property4 和 property5 的值来生成
  • 属性通常没有任何顺序。我在问实际的属性名称“prop1Copy”是如何生成的?这只是一个硬连线的属性名称吗?
  • 您的所有属性名称是否都硬连线到“property1”、“property2”等...?或者您是否正在寻找一种通用方案,该方案采用对象上的任何属性并使用那里的任何属性创建您的副本?

标签: javascript concat string-concatenation


【解决方案1】:

这是一个更通用的解决方案,可以处理更广泛的输入有一些注意事项

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 需要变化更多,则需要实现逻辑。或者传入的值...
  • 没有验证。为了示例,我保持简单,但一些错误处理会很好。

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

【讨论】:

    【解决方案2】:

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

    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】:

      试试这个:

      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)

      这会将 property# 转换为 property#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];
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 谢谢!这正是我想要的。只要键是固定的并且它们中的数量不多,这是连接值的最简单方法。
        • 假设您只有 5 个属性。
        猜你喜欢
        • 2016-06-03
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 2015-10-22
        相关资源
        最近更新 更多