如何将json对象数组的多个组合成新对象?

问题描述 投票:-2回答:2

我有一个json对象数组,我需要将它们组合在一起以创建一个对象。最终我的目标是在SQL Sever中使用OPENJSON将值插入到表中,每个对象都是一行。

看起来应该很简单。我一直在网上搜索很多,我遇到过各种各样的事情,比如_.groupBy(),$ .extend(true,{},x,y);但是它似乎没有做我想要的。

我有以下JSON对象数组:

[{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"04/29/2019"},{"name":"intStps","value":"1"}, 
{"name":"intPkgs","value":"2"}, 
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"04/30/2019"},{"name":"intStps","value":"1"}, 
{"name":"intPkgs","value":"2"}, 
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"05/01/2019"},{"name":"intStps","value":"1"}, 
{"name":"intPkgs","value":"2"}, 
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"05/02/2019"},{"name":"intStps","value":"1"}, 
{"name":"intPkgs","value":"2"}, 
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"05/03/2019"},{"name":"intStps","value":"1"}, 
{"name":"intPkgs","value":"2"}]

我需要这样分组:

Object {
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"04/29/2019"},
{"name":"intStps","value":"1"},
{"name":"intPkgs","value":"2"}
},
Object {
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"04/30/2019"},
{"name":"intStps","value":"1"},
{"name":"intPkgs","value":"2"}
},
Object {
{"name":"locMLR","value":"6485183463415278686"}, 
{"name":"dayDate","value":"05/01/2019"},{"name":"intStps","value":"1"}, 
{"name":"intPkgs","value":"2"}
}
javascript jquery json
2个回答
0
投票

你不是真正的经典意义上的分组,我会做这样的事情:

const originalData = [
    {
        "name": "locMLR",
        "value": "6485183463415278686"
    },
    {
        "name": "dayDate",
        "value": "04/29/2019"
    }, {
        "name": "intStps",
        "value": "1"
    },
    {
        "name": "intPkgs",
        "value": "2"
    },
    {
        "name": "locMLR",
        "value": "6485183463415278686"
    },
    {
        "name": "dayDate",
        "value": "04/30/2019"
    }, {
        "name": "intStps",
        "value": "1"
    },
    {
        "name": "intPkgs",
        "value": "2"
    },
    {
        "name": "locMLR",
        "value": "6485183463415278686"
    },
    {
        "name": "dayDate",
        "value": "05/01/2019"
    }, {
        "name": "intStps",
        "value": "1"
    },
    {
        "name": "intPkgs",
        "value": "2"
    },
    {
        "name": "locMLR",
        "value": "6485183463415278686"
    },
    {
        "name": "dayDate",
        "value": "05/02/2019"
    }, {
        "name": "intStps",
        "value": "1"
    },
    {
        "name": "intPkgs",
        "value": "2"
    },
    {
        "name": "locMLR",
        "value": "6485183463415278686"
    },
    {
        "name": "dayDate",
        "value": "05/03/2019"
    }, {
        "name": "intStps",
        "value": "1"
    },
    {
        "name": "intPkgs",
        "value": "2"
    }
];

const groupedData = [];
let groupedItem = [];
originalData.forEach((data, index) => {
    groupedItem.push(data);
    if (index % 4 === 3) {
        groupedData.push(groupedItem);
        groupedItem = [];
    }
});
console.log(groupedData);

1
投票

你可能想要一个像这个chunk这样的函数,它接受块大小和一个数组,并将元素分成大小的块:

const chunk = (n, arr, res = []) => arr.length == 0
  ? res
  : chunk (n, arr.slice(n), res.concat([arr.slice(0, n)]))

const arr = [{"name": "locMLR", "value": "6485183463415278686"}, {"name": "dayDate", "value": "04/29/2019"}, {"name": "intStps", "value": "1"}, {"name": "intPkgs", "value": "2"}, {"name": "locMLR", "value": "6485183463415278686"}, {"name": "dayDate", "value": "04/30/2019"}, {"name": "intStps", "value": "1"}, {"name": "intPkgs", "value": "2"}, {"name": "locMLR", "value": "6485183463415278686"}, {"name": "dayDate", "value": "05/01/2019"}, {"name": "intStps", "value": "1"}, {"name": "intPkgs", "value": "2"}, {"name": "locMLR", "value": "6485183463415278686"}, {"name": "dayDate", "value": "05/02/2019"}, {"name": "intStps", "value": "1"}, {"name": "intPkgs", "value": "2"}, {"name": "locMLR", "value": "6485183463415278686"}, {"name": "dayDate", "value": "05/03/2019"}, {"name": "intStps", "value": "1"}, {"name": "intPkgs", "value": "2"}]

console.log(chunk(4, arr))

有很多替代方法可以写这个。但是这种递归解决方案简洁明了,如果您的JS引擎执行尾调用优化,它应该相对有效。

更新

如果你想在没有递归调用的情况下执行此操作,可以使用reduce折叠数组,如下所示:

const chunk = (n, xs) => xs.reduce(
  (a, x, i) => i % n == 0 
    ? a.concat([[x]]) 
    : a.slice(0, -1).concat([a.slice(-1)[0].concat(x)]), 
  []
)

但对我来说,可读性相当低。

© www.soinside.com 2019 - 2024. All rights reserved.