获取此阵列模型的配对数据的最佳方式是什么
What is the best way to get paired data of this array model?
我是编程界的新手,请帮帮我。任何帮助都将不胜感激!我有一个数组,数据如下所示。我必须制作数据,以便在每个组中只按顺序包含成对的user_id
。如果要配对,则配对的user_id
应该不同。
[
{"user_id": 35, "group": "A"},
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "C"},
{"user_id": 39, "group": "C"}
]
所以数据会是这样的:
第一个项目已删除,因为它没有配对。第5项和第6项被删除,因为它彼此具有相同的user_id(如果要配对,user_id
应该不同)。
[
{"user_id": 35, "group": "A"}, <-- remove
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"}, <-- remove
{"user_id": 39, "group": "B"}, <-- remove
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"}, <-- remove
{"user_id": 40, "group": "B"}, <-- remove
{"user_id": 40, "group": "C"},
{"user_id": 39, "group": "C"}
]
因此,结果将是:
[
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "C"},
{"user_id": 39, "group": "C"}
]
实现这一点的最佳方法是什么(使用拼接方法或创建一个新阵列,然后推送它,或者其他方法)?
你可以这样做:
for(var i = 0; arr.length > i;) {
if (!arr[i+1] || arr[i].group != arr[i+1].group) {
//arr[i] is last in the group
arr.splice(i, 1);
} else if (arr[i].user_id == arr[i+1].user_id || (arr[i-1] && arr[i].user_id == arr[i-1].user_id && arr[i].group == arr[i-1].group)) {
//next or previous item have same id and group
arr.splice(i, 1);
} else {
//arr[i] and arr[i+1] is a valid pair
i += 2;
}
}
var arr = [
{"user_id": 35, "group": "A"}, //<-- remove
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"}, //<-- remove
{"user_id": 39, "group": "B"}, //<-- remove
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"}, //<-- remove
{"user_id": 40, "group": "B"}, //<-- remove
{"user_id": 40, "group": "C"},
{"user_id": 39, "group": "C"}
]
for(var i = 0; arr.length > i;) {
if (!arr[i+1] || arr[i].group != arr[i+1].group) {
arr.splice(i, 1);
} else if (arr[i].user_id == arr[i+1].user_id || (arr[i-1] && arr[i].user_id == arr[i-1].user_id && arr[i].group == arr[i-1].group)) {
arr.splice(i, 1);
} else {
i += 2;
}
}
arr.forEach(function(e) {
document.body.innerHTML += JSON.stringify(e) + "<br>";
});
以下是一个基于filter
和reduce
:的解决方案
var input = [{"user_id": 35, "group": "A"},
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "C"},
{"user_id": 39, "group": "C"}];
var output = input.filter(function(el, idx, input) {
// filter unique records
next = input[idx+1];
return !next || el.group !== next.group || el.user_id !== next.user_id;
}).reduce(function(prev, el, idx, input) {
// match pairs if in same group
next = input[idx+1];
return (prev.length%2 || next && el.group === next.group)
? prev.concat([el]) : prev;
}, []);
// output
document.body.innerHTML = JSON.stringify(output).replace(/'},/g, '}<br>');
您可以使用How to get unique values in a array中给出的方法,只获取数组中不同的值,然后只删除没有任何对的值
[
{"user_id": 35, "group": "A"}, <-- remove
{"user_id": 40, "group": "B"},
{"user_id": 39, "group": "B"},
{"user_id": 40, "group": "C"},
{"user_id": 39, "group": "C"}
]
相关文章:
- 在页面上记录数据并实现pushstate()的最佳方式
- 操作数据的最佳实践
- 以角度渲染表中数据的最佳方式
- 存储数据的最佳方式是什么,以便与jquery一起使用
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 将数据绘制到C3的最佳实践
- 在我的代码中管理大量硬编码数据的最佳方法
- Ext JS - 将面板绑定到数据存储的最佳方法
- 将数据从视图传输到javascript的最佳方式
- 本地存储web数据的最佳实践
- 在线/离线数据更新移动最佳实践
- angularjs设计模式和从服务器获取数据的最佳实践
- AngularJS中使用ajax获取数据的最佳方式是什么
- Spring MVC与Google图表,创建javascript数据表的最佳方式是什么
- 更新视图和控制器之间的角度重复数据值的最佳方式是什么
- 在定期更新的 Angular 中存储和使用数据的最佳方式
- 从 Angular.js 视图中修改方法中的数据的最佳做法
- 显示具有 MVC 数据绑定视图模型 ASP.NET JQuery 对话框的最佳方式
- 当数据超过 5k 时,为动手提供条件格式的最佳方法
- 形成数据最佳实践