Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据指定键的值组合JSON数据_Javascript_Json - Fatal编程技术网

Javascript 根据指定键的值组合JSON数据

Javascript 根据指定键的值组合JSON数据,javascript,json,Javascript,Json,我希望有人能向我展示一种更简单、更有效的方法来实现以下目标: 我有一些JSON数据(via),其中包含一个对象数组。它看起来像这样: const myJSON = [ {subscriber_id: "1", segment: "something", status: "subscribed", created_at: "2019-01-16 05:55:20"}, {subscriber_id: "1", segment: "another thing", status: "

我希望有人能向我展示一种更简单、更有效的方法来实现以下目标:


我有一些JSON数据(via),其中包含一个对象数组。它看起来像这样:

const myJSON = [
    {subscriber_id: "1", segment: "something", status: "subscribed", created_at: "2019-01-16 05:55:20"},
    {subscriber_id: "1", segment: "another thing", status: "subscribed", created_at: "2019-04-02 23:06:54"},
    {subscriber_id: "1", segment: "something else", status: "subscribed", created_at: "2019-04-03 03:55:16"}, 
];
[
    {subscriber_id: "1", segment: ["something", "another thing", "something else"], status: "subscribed", created_at: "2019-01-16 05:55:20"}
];
我的目标是迭代数据,并将具有相同值的
subscriber\u id
的所有对象合并到一个对象中,并将所有
值合并到一个数组中,因此结果如下所示:

const myJSON = [
    {subscriber_id: "1", segment: "something", status: "subscribed", created_at: "2019-01-16 05:55:20"},
    {subscriber_id: "1", segment: "another thing", status: "subscribed", created_at: "2019-04-02 23:06:54"},
    {subscriber_id: "1", segment: "something else", status: "subscribed", created_at: "2019-04-03 03:55:16"}, 
];
[
    {subscriber_id: "1", segment: ["something", "another thing", "something else"], status: "subscribed", created_at: "2019-01-16 05:55:20"}
];
下面是我当前的代码,它是有效的。但我对改进它的方法很感兴趣

注意:在我的实际项目中,我允许用户选择用于标识重复行的列和要组合的列,这就是为什么我的
mergeCSV
函数需要3个参数的原因

const myJSON=[{
订户id:“1”,
片段:“某物”,
状态:“已订阅”,
创建时间:“2019-01-16 05:55:20”
},
{
订户id:“1”,
片段:“另一件事”,
状态:“已订阅”,
创建时间:“2019-04-02 23:06:54”
},
{
订户id:“1”,
片段:“其他东西”,
状态:“已订阅”,
创建时间:“2019-04-03 03:55:16”
},
],
myKey=“订户\用户id”,
菌柱=[“片段”];
const mergeCSV=(数据、键、列)=>{
常数l=数据长度;
让输出=[];
//添加第一行
输出推送(数据[0]);
//将要组合到数组中的列转换为
forEach列(col=>output[0][col]=[output[0][col]);
//从头到尾循环浏览主文件
对于(变量a=1;a0;b--){
常数n=b-1;
//对于要组合的每个列
对于(变量i=0;ioutput[theOutput.length-1][col]=[theOutput[theOutput.length-1][col]);
}
}
返回输出;
}

log(mergeCSV(myJSON、myKey、myColumns))您可以使用
数组。减少
以获得更清晰的代码

const myJSON=[{
订户id:“1”,
片段:“某物”,
状态:“已订阅”,
创建时间:“2019-01-16 05:55:20”
},
{
订户id:“1”,
片段:“另一件事”,
状态:“已订阅”,
创建时间:“2019-04-02 23:06:54”
},
{
订户id:“1”,
片段:“其他东西”,
状态:“已订阅”,
创建时间:“2019-04-03 03:55:16”
},
];
//内部reduce回调使用findIndex检查累加器数组
//包含具有相同“订户”id的任何对象`
让newJSON=myJSON.reduce((acc,curr)=>{
让findIndex=acc.findIndex(item=>item.subscriber\u id==curr.subscriber\u id);
//如果累加器数组不包含具有订户id的对象,则推送
//累加器中的新对象
如果(findIndex==-1){
加速推({
订户id:当前订户id,
状态:当前状态,
段:[当前段],
创建时间:当前创建时间
});
}否则{
//使用相同的订阅服务器id更新对象
acc[findIndex].segment.push(当前段)
}
返回acc;
}, []);

console.log(newJSON)
您可以使用
array.reduce
获得更清晰的代码

const myJSON=[{
订户id:“1”,
片段:“某物”,
状态:“已订阅”,
创建时间:“2019-01-16 05:55:20”
},
{
订户id:“1”,
片段:“另一件事”,
状态:“已订阅”,
创建时间:“2019-04-02 23:06:54”
},
{
订户id:“1”,
片段:“其他东西”,
状态:“已订阅”,
创建时间:“2019-04-03 03:55:16”
},
];
//内部reduce回调使用findIndex检查累加器数组
//包含具有相同“订户”id的任何对象`
让newJSON=myJSON.reduce((acc,curr)=>{
让findIndex=acc.findIndex(item=>item.subscriber\u id==curr.subscriber\u id);
//如果累加器数组不包含具有订户id的对象,则推送
//累加器中的新对象
如果(findIndex==-1){
加速推({
订户id:当前订户id,
状态:当前状态,
段:[当前段],
创建时间:当前创建时间
});
}否则{
//使用相同的订阅服务器id更新对象
acc[findIndex].segment.push(当前段)
}
返回acc;
}, []);

log(newJSON)
您可以使用reduce,过滤掉不需要合并的键,从第一个元素获取不应该合并的键的值,从每个元素获取要合并的键的值

const myJSON=[{subscriber_id:“1”,segment:“something”,status:“subscribed”,created_:“2019-01-16 05:55:20”},{subscriber_id:“1”,segment:“something”,status:“subscribed”,created_:“2019-04-03:55:16”};
让myKey=“订户\用户id”;
设myColumns=[“片段”];
const final=myJSON.reduce((op、inp、index)=>{
let key=inp[myKey]
如果(关键){
let columnsnotbemerged=index==0&&Object.keys(inp.filter)(key=>!myColumns.includes(key))
myColumns.forEach(列=>{
op[key]=op[key]| |{}
op[key][column]=op[key][column]| |[]
操作[键][列].推送(输入[列])
})
索引===0&&columnsnotbemerged.forEach(c