我正在尝试准备一个对象以发布到我的服务器以存储一些信息。这个对象要求我根据用户选择如何收集POST所需的所有信息来执行一些GET请求。我意识到我必须修改对象才能将它们实际转换为JSON中的正确值对,而且我不确定是否有更好的方法来实现它。
我仅以一种简单的方式显示此内容,但实际问题中有6-7个非常长的对象,它们都需要修改并适合一个JSON。服务器API是以这种方式编写的,可以接受输入,但我没有任何发言权。
例如: 我从请求中得到的信息
object1: {
id: 1,
name: "table",
price: 3499
}
object2: {
id: 5,
lat: 48.56,
lng: -93.45,
address: "1080 JavaScript Street"
}
我需要成为什么:
data: {
map_id: 5,
product_id: [1],
product_name: ["table"],
product_price: [3499],
start_lat: 48.56,
start_lng: -93.45,
start_address: "1080 JavaScript Street"
}
到目前为止,我只是以一种愚蠢的方式将它们缝合在一起,我只是在这里写了这个,所以它不起作用,但是应该从逻辑上显示我的想法:
prepareDataToSend = (object1, object2) => {
//exclude uninit handling, and newObject init for arrays
let newObject = {};
newObject.map_id = object2.id;
//if there are more of object1 then I have to loop it
newObject.product_id.push(object1.id);
newObject.product_name.push(object1.name);
...etc
}
我确实得到了想要的结果,但这感觉确实很无效而且很愚蠢。更不用说这似乎很难维持。有一个更好的方法吗?我觉得我缺少一些技巧。
答案 0 :(得分:1)
您可以使用ES6 对象分解。
let object1 = {
id: 1,
name: "table",
price: 3499
};
let object2 = {
id: 5,
lat: 48.56,
lng: -93.45,
address: "1080 JavaScript Street"
};
// declaring the new object with the new properties names.
let newObject = {
map_id: '',
product_id: [],
product_name: [],
product_price: [],
start_lat: '',
start_lng: '',
start_address: ''
};
// destructuring "object1"
({id: newObject.product_id[0],
name: newObject.product_name[0],
price: newObject.product_price[0]} = object1);
// destructuring "object2"
({id: newObject.map_id,
lat: newObject.start_lat,
lng: newObject.start_lng,
address: newObject.start_address} = object2);
console.log(newObject)
结果:
{
map_id: 5,
product_id: [1],
product_name: ["table"],
product_price: [3499],
start_address: "1080 JavaScript Street",
start_lat: 48.56,
start_lng: -93.45
}
答案 1 :(得分:0)
听起来您需要类似JQuery或Angular的extend()函数,但需要对子键进行映射。
https://api.jquery.com/jquery.extend/
这是它的简单版本,可以根据您的需要进行调整。
//merge the N objects. Must have a "prefix" property to configure the new keys
var extendWithKeyPrefix = function() {
if (arguments.length == 0) return; //null check
var push = function(dst, arg) {
if (typeof arg != 'undefined' && arg != null) { //null check
var prefix = arg["prefix"]; //grab the prefix
if (typeof prefix != 'undefined' && prefix != null) { //null check
for (var k in arg) { //add everything except for "prefix"
if (k != "prefix") dst[prefix+k] = arg[k];
}
}
}
return dst;
}
arguments.reduce(push);
}
请注意,使用特定键的最后一个对象的值将获胜。例如,请注意,合并对象中的“ id”为2,而不是1。
var object1 = {id: 1, unique1: "One", prefix: "product_"};
var object2 = {id: 2, unique2: "Two", prefix: "product_"};
var object3 = {id: 3, unique3: "Three", prefix: "office_"};
var merged = {};
extend(merged, object1, object2);
// value of merged is...
// { product_id: 2,
// product_unique1: "One",
// product_unique2: "Two",
// office_id: 3,
// office_unique3: "Three"
// }