【问题标题】:angularjs - javascript - Convert object values from array to stringangularjs - javascript - 将对象值从数组转换为字符串
【发布时间】:2016-07-25 20:39:56
【问题描述】:

我在 js 中遇到了一些关于对象、json 等的问题。如果有人可以帮助我做某事,那就太棒了! :)

我有一个无法更改的对象,如下所示:

{
  "page": [
    "POST",
    "DELETE"
  ],
  "news": [
    "PUT"
  ]
}

我想变成这样:

{
  "page": "POST, DELETE",
  "news": "PUT"
}

所以我希望对象值(数组)是字符串,我还尝试了 toString()、String()、JSON.stringify 和其他来自互联网的方法,(也许我没有做对)但没有一个奏效对我来说,我对处理这些类型的数据有点陌生,所以如果有人可以帮助我,TKS !! :D

编辑:

如果我得到了这个结构:

{
  "page": {
    "POST": [
      "POST"
    ],
    "PUT": 122
  },
  "news": {
    "PUT": [
      "PUT"
    ]
  }
}

我怎样才能变成这样:

{
  "page": "POST, PUT:122",
  "news": "PUT"
}

【问题讨论】:

  • 所以循环对象并使用join
  • 你说过一个我无法改变的对象,因为初始对象应该保持不可变?

标签: javascript arrays json string object


【解决方案1】:

如果您想修改初始对象 - 使用 Object.keysArray.forEach 函数就足够了:

var obj = {
  "page": [
    "POST",
    "DELETE"
  ],
  "news": [
    "PUT"
  ]
};

Object.keys(obj).forEach(function(k) {
  obj[k] = obj[k].join(",");
});

console.log(JSON.stringify(obj, 0, 4));

其他复杂情况的解决方案

var obj = {
  "page": {
    "POST": [
      "POST"
    ],
    "PUT": 122
  },
  "news": {
    "PUT": [
      "PUT"
    ]
  }
};

Object.keys(obj).forEach(function (k) {
  var innerKeys = Object.keys(obj[k]), items = [];
  innerKeys.forEach(function(key) {
    items.push((Array.isArray(obj[k][key]))? key : key + ":" + obj[k][key]);
  });
  obj[k] = items.join(",");
});

console.log(JSON.stringify(obj, 0, 4));

【讨论】:

  • Tks RomanPerekhrest,你和@epascarello 的答案是最好的。实际上,我可以在保存的时候更改初始结构。
  • 我对@RomanPerekhrest 进行了编辑,如果你能帮助我解决第二种情况,那就太好了。提前谢谢! :)
  • 非常感谢@RomanPerekhrest,出色的实现!我在这里学到了太多。 Tks
  • 嗨@RomanPerekhrest,我在这里学习,我正在尝试对复杂的情况进行反向案例,尝试恢复相同的结构,但没有成功,如果可以的话,如果你有时间可以帮帮我吗?谢谢。
  • @LucasSantos,这是一个用新问题描述创建新问题的好机会。创建完成后告诉我
【解决方案2】:

假设您的对象将始终将数组作为属性值,您可以使用下面的 javascript 来做到这一点

 var obj = {
     "page": [
         "POST",
         "DELETE"
     ],
     "news": [
         "PUT"
     ]
 };


 for (var o in obj) {
     if (obj.hasOwnProperty(o)) {
         obj[o] = obj[o].join(", ");
     }
 }

 console.log(obj);

【讨论】:

  • 这行得通,但我认为 Object.keys 方法更好。无论如何@HectorBarbossa
【解决方案3】:

好的,因此您可以使用var str = array.join(stringThatIsSupposedToBeInbetweenTheValues); 将数组的所有值添加(连接)到字符串中。所以在你的情况下,这将是array.join(', ');。请注意,此字符串仅放在单个值之间,而不是在它们周围(在结果的开头或结尾)。更多信息here.

希望对你有帮助!

【讨论】:

    【解决方案4】:

    有很多方法可以做到这一点。只需要遍历对象并将数组设置为字符串。

    var obj = {
      "page": [
        "POST",
        "DELETE"
      ],
      "news": [
        "PUT"
      ]
    };
    
    Object.keys(obj).reduce( function (o, key) {  
        o[key] = o[key].join(", ");
        return o;
    }, obj);
    
    console.log(obj);

    使用 forEach 可能有意义,但 reduce 有效。

    【讨论】:

    • Tks epascarello,你和@RomanPerekhrest 的答案是最好的。我选择 forEach 方法。
    【解决方案5】:

    你可以这样做;

    var o = {
      "page": [
        "POST",
        "DELETE"
      ],
      "news": [
        "PUT"
      ]
    },
        p = Object.keys(o).reduce((p,k) => (p[k] = o[k]+"",p),{});
    console.log(p);

    【讨论】:

    • 这看起来不错,但我在 Webstorm 和 JSHint 测试此代码时遇到错误。但看起来就像@epascarello 的答案。
    • @LucasSantos 这可能是因为你禁用了 ES6 并且胖箭头功能 (p,k) => (p[k] = o[k]+"",p),{}) 在 ES6 之前不起作用。见MDN。要在 WebStorm 中启用 ES6,请打开 Setting --> Lanuages & Frameworks --> JavaScript 并选择 ECMAScript 6 而不是 5.1
    • 不错@LBBO,它现在很活跃,我正在研究 ES6,昨天拿到了一本书。 :D
    猜你喜欢
    • 2016-12-07
    • 2013-04-19
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2016-03-09
    • 2013-01-18
    • 2017-08-24
    • 2014-03-12
    相关资源
    最近更新 更多