我们正在使用 Postman 进行 API 测试。我们返回的一些对象非常冗长且不易处理,所以我想创建一个辅助方法使它们更简洁一些。我知道有各种各样的转换库,比如 node-json-transform , selecttransform , jsontransforms等等,但不幸的是我只能使用 Postman Sandbox libraries和 Vanilla JS。
我正在寻找最简单的(最少的 loc 和函数)方法来转换此对象:
var verbose = [
{
"Key": "Name",
"Value": "John Doe",
"Instance": 1
},
{
"Key": "Age",
"Value": "33",
"Instance": 1
},
{
"Key": "Child",
"Value": "Jane",
"Instance": 1
},
{
"Key": "Child",
"Value": "Rocky",
"Instance": 2
}];
进入这个:
var concise = {
"Name": "John Doe",
"Age": "33",
"Child": ["Jane", "Rocky"]
};
然后再次回到冗长的形式。
我已经尝试了对每个对象进行 foreach-ing 并将属性/值添加到新对象的 native 方法,但是当我到达多实例键/值对时,它很快就变丑了。我可以想象有一种使用 map/reduce 的更简单的方法,但我不熟悉这些方法。
最佳答案
根据我对您问题的理解,您希望从verbose
对象数组创建键值对。但是,如果存在键冲突,则应将值转换为数组。
考虑到这一点,您将必须:
- 使用
forEach
遍历您的对象数组。 - 如果键不冲突,我们简单地创建一个新的键值对
- 如果键冲突,那就有点棘手了:
- 如果键冲突并且这是第一次出现,我们将键值对中的值转换为数组
- 如果键冲突并且这不是第一次出现,我们知道我们正在查看一个数组
- 现在我们肯定有一个数组,所以我们将我们的值放入其中
请参阅下面的概念验证:
var verbose = [{
"Key": "Name",
"Value": "John Doe",
"Instance": 1
},
{
"Key": "Age",
"Value": "33",
"Instance": 1
},
{
"Key": "Child",
"Value": "Jane",
"Instance": 1
},
{
"Key": "Child",
"Value": "Rocky",
"Instance": 2
}];
var concise = {};
verbose.forEach(function(i) {
var key = i['Key'];
var value = i['Value'];
// If item exists, we want to convert the value into an array of values
if (key in concise) {
var item = concise[key];
// If it is not an array already, we convert it to an array
if (!Array.isArray(item))
item = [item];
item.push(value);
concise[key] = item;
}
// If item does not exist, we simply create a new key-value pair
else {
concise[key] = value;
}
});
console.log(concise);
关于javascript - 有没有简单的方法来回转换这个 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54902991/