Javascript 从JSON结果创建JSON结构

Javascript 从JSON结果创建JSON结构,javascript,Javascript,给定此JavaScript对象: [ { "label": "NewNetworkServiceProvider", "value": "NewNetworkServiceProvidered46c4ee-7ec1-45d6-9d13-94e301d2f890" }, { "label": "PurchaseOrderNumber", "value": "PurchaseOrderNumber4be9f460-0c98-4038-910d-027565f83e1c

给定此JavaScript对象:

[
{
    "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))