我是编程世界的新手,请帮助我。任何帮助,将不胜感激!
我有一个数组如下所示的数据。我必须创建数据,以便每个组中只包含成对的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"}
]
实现这一目标的最佳方法是什么(使用拼接方法或创建新阵列然后推送它或其他方式)?
答案 0 :(得分:1)
你可以这样做:
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>";
});
&#13;
答案 1 :(得分:1)
以下是基于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>');
答案 2 :(得分:0)
您可以使用How to get unique values in an 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"}
]