【问题标题】:Convert object's properties and values to array of key value pairs将对象的属性和值转换为键值对数组
【发布时间】:2013-01-14 22:58:40
【问题描述】:

我对 JavaScript 很陌生,不确定这是否可行,但基本上我想获取一个对象并将其转换为格式中的字符串数组; array[0] = 'prop1=value1'

这背后的原因是我让用户将 k=v 对的列表输入到表单中,后来它被写为 json blob 中的对象。从键值 csl 到 json 对象很简单,现在我需要以另一种方式返回(我已经通过 ajax 调用接收到 JSON 并希望填充一个空白表单)。这在 JavaScript 中可能吗?如果不是,请提供合理的解决方法。

示例代码;

调试器中的对象;

 Object
        private_key: "private-key"
        public_key: "public-key"

我需要将其转换为;

 "private_key=private-key,public_key=public-key"

基本上我需要这样的东西(伪代码)

var outputString = '';
foreach (prop in obj)
{
    outputString = outputString + prop.tostring() + '=' + prop.value + ',';
}

【问题讨论】:

  • 您有什么理由不使用JSON.parse()JSON.stringify()
  • “从键值 csl 出发” - 什么是 CSL?
  • 在此之前,我使用 JSON.parse() 从 json 中获取对象。问题在于显示属性名称而不仅仅是它们的值。
  • @stevebot 逗号分隔列表
  • @evanmcdonnal:如果您发现 key-value-csl -> 对象很简单,那么反过来也应该是微不足道的?你试过什么,你卡在哪里了?

标签: javascript reflection introspection


【解决方案1】:
var array = [];
for (k in o)
{
    if (o.hasOwnProperty(k))
    {
        array.push(k+"="+o[k]);
    }
}

然后您可以join 数组作为您的最终字符串。

【讨论】:

    【解决方案2】:

    你可能正在寻找类似的东西

    var obj = {value1: 'prop1', value2: 'prop2', value3: 'prop3'};
    var arr = [];
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            arr.push(key + '=' + obj[key]);
        }
    };
    var result = arr.join(',');
    alert(result);
    

    请注意,如果您的值是字符串,它将正常工作;如果它们是复杂的对象,那么您需要添加更多代码。

    或者您可以只使用jQuery.param,它可以满足您的需求,即使对于复杂类型也是如此(尽管它使用& 字符作为分隔符,而不是逗号。

    【讨论】:

    • 如果您想将您的对象转换为请求查询,则始终建议使用jQuery.params,而不是容易出错的自定义代码。
    【解决方案3】:
    var object = {
        private_key: "private-key",
        public_key: "public-key"
    };
    
    var array = [];
    for (var prop in object)
        array.push(prop + "=" + object[prop]);
    return array.join(','); // "private_key=private-key,public_key=public-key"
    

    请注意,订单不保证。

    【讨论】:

    • 保证....只是按字母顺序而不是下订单。
    • @GoldBishop 不,it's not。如果你想要字母顺序,请array.sort().join(',')
    • 也许是它的发生状态,但它对我来说非常可靠,无需使用排序。但我通常也从 Object -> Array -> String 或只是 Object -> String.
    • 是的,这似乎是偶然的。您不能依赖它,但大多数实现确实保持定义顺序(我还没有听说过字母顺序)。
    • 也可能是 Chrome 在检查各种类型时应用了自己的排序。
    【解决方案4】:

    obj = {
      private_key: "private-key",
      public_key: "public-key"
    }
    
    str = JSON.stringify(obj).replace(/[{}]/g, '').replace(/"/g, '').replace(/:/g, '=');
    console.log("Using JSON.stringify:\n", str);
    
    str = Object.keys(obj).map((key) => `${key}=${obj[key]}`).join(',')
    console.log("Using ES6 keys/map:\n", str);
    
    str = jQuery.param(obj).replace(/&/g,',');
    console.log("Using jQuery.param:\n", str);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    【讨论】:

      【解决方案5】:

      在 ES6 中你可以使用Object.entries({object1:1,object2:2});。结果是:[["object1",1],["object2",2]]

      【讨论】:

        【解决方案6】:
        var obj =[
                    {'2018-05-07':1},
                    {'2018-05-08':3},
                    {'2018-05-09':2}
                ];
        
                for(var i of obj) {
                    var key = Object.keys(i).toString();
                    console.log(i,'=',i[key]);
                }
        

        结果

        【讨论】:

          【解决方案7】:

          1 班轮:

          Object.entries(yourObj).map(e => ({ name: e[0], value: e[1] }));
          

          使用示例:

          let yourObj = { foo: "bar", baz: "bas" };
          
          // turn object properties into array entries
          let array = Object.entries(yourObj).map(e => ({ name: e[0], value: e[1] }));
          
          // returns
          array = [
            { name: "foo", value: "bar" },
            { name: "baz", value: "bas" },
          ]
          // loop over it
          for (let prop of array) {
            console.log(prop.name, "=", prop.value);
          }
          // shows
          foo = bar
          baz = bas
          

          或者,以您想要的格式创建字符串:

          Object.entries(yourObj).map(e => e[0] + "=" + e[1]).join(",");
          "foo=bar,baz=bas"
          

          【讨论】:

            猜你喜欢
            • 2022-11-01
            • 2018-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-14
            • 1970-01-01
            相关资源
            最近更新 更多