将对象的属性和值转换为键值对数组

23

我对JavaScript还比较新,不确定是否能够实现下面所述的功能,但基本上我想将一个对象转换成一个字符串数组,格式如下:array[0] = 'prop1=value1'

做这件事的原因是因为我让用户在表单中输入k=v键值对列表,稍后它会作为对象写入json blob中。从键值对列表到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()呢? - NullUserException
从键值CSL开始 - CSL是什么? - stevebot
在此之前,我使用了 JSON.parse() 从 json 中获取一个对象。问题在于如何显示属性名称而不仅仅是它们的值。 - evanmcdonnal
@stevebot 逗号分隔列表 - evanmcdonnal
@evanmcdonnal:如果你觉得从键值对字符串转换成对象很简单,那么反过来也应该很容易吧?你尝试过什么,卡在哪里了? - Bergi
@Bergi 我没有找到之前输入的键值对列表 key-value-csl,它是作为较大 JSON 对象中的一部分对象写入的。现在我已经通过 AJAX 调用获取了该 JSON,并尝试以用户最初提交表单时的方式填充表单。我将尝试添加更多细节以澄清。 - evanmcdonnal
7个回答

41

你可能在寻找类似于以下内容的东西

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而不是容易出错的自定义代码。 - Juzer Ali

5

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


4
var array = [];
for (k in o)
{
    if (o.hasOwnProperty(k))
    {
        array.push(k+"="+o[k]);
    }
}

您可以将数组使用join函数拼接成最终字符串。

4
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
@GoldBishop 不是这样的。如果你想要按字母顺序排列,可以使用 array.sort().join(',') - Bergi
也许这只是巧合,但在不使用排序的情况下,它对我来说非常可靠。但我通常会从对象->数组->字符串或仅从对象->字符串转换。 - GoldBishop
是的,这似乎是偶然的。你不能依赖它,但大多数实现确实保持定义顺序(我没有听说过按字母顺序的)。 - Bergi
可能是 Chrome 在检查各种类型时应用了自己的排序。 - GoldBishop

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

结果

enter image description here


2

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>


0

一行代码:

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接