根据某些键合并驻留在json数组中的行
寻找问题的解决方案:
需要合并以下数组,以便最终输出只有一行对应于类别和子类别的每个唯一组合,其余字段(主题和个人)合并为一个单独的数组:
输入:
[
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic3"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic4"
]
},
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic5",
"topic2"
]
},
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat3",
"subcategory":"c",
"personal":[
"inclsn3"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":null,
"topic":[
"topic6"
]
}
]
预期产量:
[{"category": "cat2", "subcategory": "b", "personal": ["inclsn2"], "topic": ["topic2","topic5","topic4","topic1"]},
{"category": "cat1", "subcategory": "a", "personal": ["inclsn2"], "topic": ["topic6","topic2","topic4","topic1"]},
{"category": "cat3", "subcategory": "c", "personal": ["inclsn3"], "topic": ["topic1","topic2"]}]
任何有关这方面的帮助将受到高度赞赏。
谢谢
回答如下:您的问题的一个解决方案是使用之前未看到类别/子类别组合的条件来过滤数组。您可以使用一个对象,其键是类别/子类别的某种组合(例如,与某些分隔符连接),并查看该对象是否具有给定键。
你可以这样做:
const input = [] // your array here
const d = '\t';
const merge = (a, c = {}) => a.filter((e, f, k) =>
(k = e.category + d + e.subcategory, f = c[k], c[k] = 1, !f));
console.log(merge(input));
确保将d
设置为某个永远不属于真实类别或子类别名称的字符串 - 这里它是一个制表符,但您可以将其设置为其他任何内容。
数组的输出:
[ { category: 'cat2',
subcategory: 'b',
personal: [ 'inclsn2' ],
topic: [ 'topic1', 'topic3' ] },
{ category: 'cat1',
subcategory: 'a',
personal: [ 'inclsn2' ],
topic: [ 'topic4' ] },
{ category: 'cat3',
subcategory: 'c',
personal: [ 'inclsn3' ],
topic: [ 'topic1', 'topic2' ] } ]
如果您使用Lodash,那么您可以进一步简化您的merge()
功能:
const _ = require('lodash');
const d = '\t';
const merge = a => _.uniqBy(a, e => e.category + d + e.subcategory);
console.log(merge(input));
根据某些键合并驻留在json数组中的行
寻找问题的解决方案:
需要合并以下数组,以便最终输出只有一行对应于类别和子类别的每个唯一组合,其余字段(主题和个人)合并为一个单独的数组:
输入:
[
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic3"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic4"
]
},
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic5",
"topic2"
]
},
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat2",
"subcategory":"b",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat3",
"subcategory":"c",
"personal":[
"inclsn3"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":[
"inclsn2"
],
"topic":[
"topic1",
"topic2"
]
},
{
"category":"cat1",
"subcategory":"a",
"personal":null,
"topic":[
"topic6"
]
}
]
预期产量:
[{"category": "cat2", "subcategory": "b", "personal": ["inclsn2"], "topic": ["topic2","topic5","topic4","topic1"]},
{"category": "cat1", "subcategory": "a", "personal": ["inclsn2"], "topic": ["topic6","topic2","topic4","topic1"]},
{"category": "cat3", "subcategory": "c", "personal": ["inclsn3"], "topic": ["topic1","topic2"]}]
任何有关这方面的帮助将受到高度赞赏。
谢谢
回答如下:您的问题的一个解决方案是使用之前未看到类别/子类别组合的条件来过滤数组。您可以使用一个对象,其键是类别/子类别的某种组合(例如,与某些分隔符连接),并查看该对象是否具有给定键。
你可以这样做:
const input = [] // your array here
const d = '\t';
const merge = (a, c = {}) => a.filter((e, f, k) =>
(k = e.category + d + e.subcategory, f = c[k], c[k] = 1, !f));
console.log(merge(input));
确保将d
设置为某个永远不属于真实类别或子类别名称的字符串 - 这里它是一个制表符,但您可以将其设置为其他任何内容。
数组的输出:
[ { category: 'cat2',
subcategory: 'b',
personal: [ 'inclsn2' ],
topic: [ 'topic1', 'topic3' ] },
{ category: 'cat1',
subcategory: 'a',
personal: [ 'inclsn2' ],
topic: [ 'topic4' ] },
{ category: 'cat3',
subcategory: 'c',
personal: [ 'inclsn3' ],
topic: [ 'topic1', 'topic2' ] } ]
如果您使用Lodash,那么您可以进一步简化您的merge()
功能:
const _ = require('lodash');
const d = '\t';
const merge = a => _.uniqBy(a, e => e.category + d + e.subcategory);
console.log(merge(input));