Javascript 从JSON结果创建JSON结构
给定此JavaScript对象:Javascript 从JSON结果创建JSON结构,javascript,Javascript,给定此JavaScript对象: [ { "label": "NewNetworkServiceProvider", "value": "NewNetworkServiceProvidered46c4ee-7ec1-45d6-9d13-94e301d2f890" }, { "label": "PurchaseOrderNumber", "value": "PurchaseOrderNumber4be9f460-0c98-4038-910d-027565f83e1c
[
{
"label": "NewNetworkServiceProvider",
"value": "NewNetworkServiceProvidered46c4ee-7ec1-45d6-9d13-94e301d2f890"
},
{
"label": "PurchaseOrderNumber",
"value": "PurchaseOrderNumber4be9f460-0c98-4038-910d-027565f83e1c"
},
{
"label": "RawRecordType",
"value": "RawRecordType2a774afb-0fd4-4fd4-a3c6-88041de5b1ad"
}
]
我想把它改成这样
{
"Header": {
"NewNetworkServiceProvider": "NewNetworkServiceProvidera9ae97fe-e59a-4678-91ea-5a03c7d0f5cc",
"PurchaseOrderNumber": "PurchaseOrderNumberdf932a47-1476-4a78-a9d0-de538ed8306b",
"RawRecordType": "RawRecordType12e9d37c-f8dd-4251-bc55-7c83732b5629"
}
}
到目前为止,我的代码看起来像这样,但我无法在最终结果中使用动态标签。基本上,我希望在新的输出中动态地替换“label”和“value”
var lscRespDetail = {};
lscRespDetail.data = {};
lscRespDetail.data.results = [];
for (var i = 0; i <= lscheader.data.results.length; i++) {
if (lscheader.data.results[i] != undefined) {
var sLabel = lscheader.data.results[i].label;
var sValue = lscheader.data.results[i].value;
var obj = {
Header: {
sLabel: lscheader.data.results[i].label, sValue: lscheader.data.results[i].value
}
};
obj.sLabel = sLabel;
obj.sValue = sValue;
lscResp.data.results.push(obj);
}
}
var lscRespDetail={};
lscRespDetail.data={};
lscRespDetail.data.results=[];
对于(var i=0;i对象上的数组如何
var obj = {Header: {}};
var header = obj.Header;
lscheader.data.results.map(function (item) {
header[item.label] = item.value;
});
obj
现在应该保存您想要的结构。您可以在数组上使用简单的迭代
var obj = {
header: {}
};
lscheader.data.results.forEach(function (item) {
obj.header[item.label] = item.value;
});
lscResp.data.results.push(obj);
演示:
来制作你的代码
//need to use the same object in the iteration, should not recreate it in the loop
var obj = {
header: {}
};
//array index is from 0..length-1
for (var i = 0; i < lscheader.data.results.length; i++) {
if (lscheader.data.results[i] != undefined) {
var sLabel = lscheader.data.results[i].label;
var sValue = lscheader.data.results[i].value;
//use bracket notation
obj[sLabel] = sLabel;
}
}
lscResp.data.results.push(obj);
console.log(obj)
//需要在迭代中使用相同的对象,不应在循环中重新创建它
var obj={
标题:{}
};
//数组索引的范围为0..length-1
对于(var i=0;i
由于需要从变量的值获取对象键,因此需要使用
reduce
是从数组构造对象的常用隐喻。我们从一个空对象(即{}
)开始,然后循环数组的元素,每次都向对象添加属性
如果您在ES6环境中,可以使用fat arrow函数更简洁地编写上述内容:
{ Header:
input.reduce((result, elt) =>
Object.defineProperty(result, elt.label, { value: elt.value }),
}, {})
}
基于合并的方法
另一种方法是将每个数组元素转换为一个小的属性对象,然后合并所有这些属性对象。假设我在ES6环境中(请参见下面的ES5),情况如下:
function to_object(elt) { return { [elt.label]: elt.value; } }
[elt.label]
这里是一个ES6“计算属性名”
给定输入
{
"label": "NewNetworkServiceProvider",
"value": "NewNetworkServiceProvidered46c4ee-7ec1-45d6-9d13-94e301d2f890"
}
它回来了
{ "NewNetworkServiceProvider": "NewNetworkServiceProvidered46c4ee-..." }
一旦我有了创建这些迷你对象的方法,我将使用map
从原始数组中创建一个数组:
input.map(to_object)
这给了我一个对象数组,看起来像:
[
{ "NewNetworkServiceProvider": "NewNetworkServiceProvidered46c4ee-..." },
{ "PurchaseOrderNumber": "PurchaseOrderNumberdf932a47-1476-4a78-a9d0-de538ed8306b" }
]
现在我需要将这些合并在一起。在ES6中,我可以
Object.assign({}, ...input.map(to_object))
使用对象。分配和扩展运算符
因此,最终的ES6解决方案非常紧凑:
Object.assign({}, ...input.map(elt => ({[elt.label]: elt.value})));
在ES5中合并小对象
如果您没有ES6,您可以将作为
function to_object(elt) {
var obj = {};
obj[elt.label] = elt.value;
return obj;
}
或
假设我的库中有一个类似合并的函数(让我们使用.extend
;您也可以使用$.extend
),并使用apply
来实现扩展运算符的效果:
_.extend.apply(null, input.map(to_object))
您可以使用forEach
而不是map
来looping@vihan10866是一个,六个是另一个。在这种情况下,我会选择map
而不是foreach
,因为OP从技术上讲是从一个数据结构映射到另一个数据结构。哦,好吧,但是map
也要求返回一个元素。从技术上讲,这不是c完全有效,可能会让一些人感到困惑。lscheader.data.results
包含数据。您可以用它更新您的答案
function to_object(elt) {
return Object.defineProperty({}, elt.label, { value: elt.value });
}
_.extend.apply(null, input.map(to_object))