交集的Javascript组数组

时间:2017-02-10 18:43:38

标签: javascript arrays sorting

给定一对成对整数,我如何按交叉点分组。有没有人有一个简单的功能,可以将我的输入转换为所需的输出?

输入

[
    [0, 1, 3],
    [4, 5, 6, 8]
]

期望的输出

x:y

更新:

@apsiller在评论中更清楚地问了我的问题然后我最初发布了:

“将每个数字视为图表中的节点,并将每个配对x视为节点ypublic static bool someBool = false; public TypeOf<Bool> findBool(string id) { if (id == "item1") return someBool; } 之间的边缘,找到可以使用的数字集合边界定义。也就是说,在图论中,在这样的图中找到不同的connected components

例如,没有办法从4到0旅行,所以它们在不同的组中,但有一种方法可以从1到0(通过3),因此它们属于同一组。“< / p>

重申所需的输出是一组基于潜在随机输入集的可穿越节点。

4 个答案:

答案 0 :(得分:2)

你可以这样做。

function group(data) {
  var r = [[]],c = 0,a = [0]
  var d = data.map(e => e.split(':').sort((a, b) => a - b)).sort((a, b) => a[0] - b[0])
  
  d.forEach(function(e, i) {
    if (e[0] > a[a.length - 1]) {
      r.push(e)
      a.push(e[1])
      c++
    } else {
      r[c] = r[c].concat(e)
      a[a.length - 1] = e[1]
    }
  })
  return r.map(e => [...new Set(e)].sort((a, b) => a - b))
}

var test1 = ["0:3", "1:3", "4:5", "5:6", "6:8"]
var test2 = ["0:3", "1:3", "4:5", "9:11", "10:12", '3:6', "7:8"]
var test3 = ["20:15", "4:0", "1:3", "5:1", "9:11", "10:12", '3:6', "8:7"]

console.log(JSON.stringify(group(test1)))
console.log(JSON.stringify(group(test2)))
console.log(JSON.stringify(group(test3)))

答案 1 :(得分:1)

谢谢大家。鉴于每个人的输入,我能够在这里找到一个类似的问题,这引出了我的答案。 Finding All Connected Components of an Undirected Graph

第一步是将输入更改为成对组。

var input = [
    [0, 3],
    [1, 3],
    [4, 5],
    [5, 6],
    [6, 8]
]

下一步是使用名为广度优先搜索

的广告
function breadthFirstSearch(node, nodes, visited) {
    var queue = [];
    var group = [];
    var pair  = null;
    queue.push(node);
    while (queue.length > 0) {
        node = queue.shift();
        if (!visited[node]) {
            visited[node] = true;
            group.push(node);
            for (var i = 0, len = nodes.length; i < len; i++) {
                pair = nodes[i];
                if (pair[0] === node && !visited[pair[1]]) {
                    queue.push(pair[1]);
                } else if (pair[1] === node && !visited[pair[0]]) {
                    queue.push(pair[0]);
                }
            }
        }
    }
    return group;
};
function groupReachableVertices(input) {
    var groups  = [];
    var visited = {};
    for (var i = 0, len = input.length; i < len; i += 1) {
        var current_pair = input[i];
        var u = current_pair[0];
        var v = current_pair[1];
        var src = null;
        if (!visited[u]) {
            src = u;
        } else if (!visited[v]) {
            src = v;
        }
        if (src) {
            groups.push(breadthFirstSearch(src, input, visited));
        }
    }
    return groups;
};

全部放在一起......

var output = groupReachableVertices(input);
[
    [0, 1, 3],
    [4, 5, 6, 8]
]

答案 2 :(得分:0)

您可以使用哈希表并收集其中的所有节点。它适用于任何值。

&#13;
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
{{1}}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我想,通过使用Object.values()Set对象,您可以在ES6中执行以下操作。

function getConnectedVertices(a){
  return [...new Set(Object.values(a.reduce((h,v) => (h[v[0]] ? h[v[1]] ? (h[v[0]] = h[v[0]].concat(h[v[1]]),
                                                                           h[v[1]] = h[v[0]])
                                                                        : (h[v[0]].push(v[1]),
                                                                           h[v[1]] = h[v[0]])
                                                              : h[v[1]] ? (h[v[1]].push(v[0]),
                                                                           h[v[0]] = h[v[1]])
                                                                        :  h[v[0]] = h[v[1]] = v,
                                            h),{})))];
}

var input = ["0:3", "1:3", "4:5", "5:6", "6:8"].map(s => s.split(":")),
   result = getConnectedVertices(input);
console.log(result);