获取此阵列模型的配对数据的最佳方式是什么

What is the best way to get paired data of this array model?

本文关键字:数据 最佳 方式 是什么 阵列 模型 获取      更新时间:2023-09-26

我是编程界的新手,请帮帮我。任何帮助都将不胜感激!我有一个数组,数据如下所示。我必须制作数据,以便在每个组中只按顺序包含成对的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>";
});

以下是一个基于filterreduce:的解决方案

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"}
]