下划线、嵌套分组依据并生成 JSON
Underscore, Nested Group By and Generate a JSON
我有一个包含重复项的对象数组,我正在尝试获取一个唯一列表,其中唯一性由对象属性的子集定义。例如,
当前JSON对象:
[{"x":6811,"y":15551,"a":"a"},
{"x":6811,"y":15551,"a":"b"},
{"x":6811,"y":15551,"a":"c"},
{"x":6811,"y":15552,"a":"c"},
{"x":6812,"y":15551,"a":"c"}]
如何按两个分组 属性
最后的结果是
[{"x":6811,"y":15551,"a":["a","b","c"]},
{"x":6811,"y":15552,"a":["c"]},
{"x":6812,"y":15551,"a":["c"]}]
如何使用下划线使其唯一并生成合并"a"键
这是一个使用 reduce
和 Object.values
的原始 js 解决方案
var output = Object.values( arr.reduce( (acc, c) => {
var {x,y} = c;
var key = JSON.stringify({x,y}); //create a key with both x and y
if ( acc[ key ] )
{
acc[ key ].a.push(c.a); //if key is already set, then push the value in a
}
else
{
acc[ key ] = c; //else set c as value for this key
acc[ key ].a = [acc[ key ].a];
}
return acc;
} ,{}) );
演示
var arr = [{
"x": 6811,
"y": 15551,
"a": "a"
},
{
"x": 6811,
"y": 15551,
"a": "b"
},
{
"x": 6811,
"y": 15551,
"a": "c"
},
{
"x": 6811,
"y": 15552,
"a": "c"
},
{
"x": 6812,
"y": 15551,
"a": "c"
}
];
var output = Object.values(arr.reduce((acc, c) => {
var {
x,
y
} = c;
var key = JSON.stringify({
x,
y
}); //create a key with both x and y
if (acc[key]) {
acc[key].a.push(c.a); //if key is already set, then push the value in a
} else {
acc[key] = c; //else set c as value for this key
acc[key].a = [acc[key].a];
}
return acc;
}, {}));
console.log( output );
您可以使用 groupBy
在 x
和 y
上创建复合键。然后,使用 map
遍历分组数据。
var data = [{"x":6811,"y":15551,"a":"a"},{"x":6811,"y":15551,"a":"b"},{"x":6811,"y":15551,"a":"c"},{"x":6811,"y":15552,"a":"c"},{"x":6812,"y":15551,"a":"c"}]
var groups = _.groupBy(data, ({x,y}) => `${x}_${y}`);
var result = _.map(groups, o => ({...o[0], a : _.pluck(o,'a')}));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
我有一个包含重复项的对象数组,我正在尝试获取一个唯一列表,其中唯一性由对象属性的子集定义。例如,
当前JSON对象:
[{"x":6811,"y":15551,"a":"a"},
{"x":6811,"y":15551,"a":"b"},
{"x":6811,"y":15551,"a":"c"},
{"x":6811,"y":15552,"a":"c"},
{"x":6812,"y":15551,"a":"c"}]
如何按两个分组 属性
最后的结果是
[{"x":6811,"y":15551,"a":["a","b","c"]},
{"x":6811,"y":15552,"a":["c"]},
{"x":6812,"y":15551,"a":["c"]}]
如何使用下划线使其唯一并生成合并"a"键
这是一个使用 reduce
和 Object.values
var output = Object.values( arr.reduce( (acc, c) => {
var {x,y} = c;
var key = JSON.stringify({x,y}); //create a key with both x and y
if ( acc[ key ] )
{
acc[ key ].a.push(c.a); //if key is already set, then push the value in a
}
else
{
acc[ key ] = c; //else set c as value for this key
acc[ key ].a = [acc[ key ].a];
}
return acc;
} ,{}) );
演示
var arr = [{
"x": 6811,
"y": 15551,
"a": "a"
},
{
"x": 6811,
"y": 15551,
"a": "b"
},
{
"x": 6811,
"y": 15551,
"a": "c"
},
{
"x": 6811,
"y": 15552,
"a": "c"
},
{
"x": 6812,
"y": 15551,
"a": "c"
}
];
var output = Object.values(arr.reduce((acc, c) => {
var {
x,
y
} = c;
var key = JSON.stringify({
x,
y
}); //create a key with both x and y
if (acc[key]) {
acc[key].a.push(c.a); //if key is already set, then push the value in a
} else {
acc[key] = c; //else set c as value for this key
acc[key].a = [acc[key].a];
}
return acc;
}, {}));
console.log( output );
您可以使用 groupBy
在 x
和 y
上创建复合键。然后,使用 map
遍历分组数据。
var data = [{"x":6811,"y":15551,"a":"a"},{"x":6811,"y":15551,"a":"b"},{"x":6811,"y":15551,"a":"c"},{"x":6811,"y":15552,"a":"c"},{"x":6812,"y":15551,"a":"c"}]
var groups = _.groupBy(data, ({x,y}) => `${x}_${y}`);
var result = _.map(groups, o => ({...o[0], a : _.pluck(o,'a')}));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>