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

时间:2016-01-04 19:12:38

标签: javascript arrays algorithm

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

实现这一目标的最佳方法是什么(使用拼接方法或创建新阵列然后推送它或其他方式)?

3 个答案:

答案 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;
  }
}

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:1)

以下是基于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>');

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