【问题标题】:Arrays two dimensional convert to small array数组二维转换为小数组
【发布时间】:2016-09-06 05:14:49
【问题描述】:

有一个数组 arr =

[ [1,2] , [5,1], [23,24], [3,4], [22,23], [2,3]]
output needed = [[5,1,2,3,4],[22,23,24]]

尝试使用 concat,减少 javascript 中数组的方法,但无法达到预期的结果 - 有什么想法吗?

【问题讨论】:

  • 输入数组和输出数组是什么关系?
  • 你到底是怎么想出所需的输出的?作为一个一般的起点,我会去lodash.com/docs#union,但这只是第一个看起来有点相关的方法。随意浏览列出的其他人
  • 输出数组基本上是 - 当我们看到 5 时的路径 1,2 - 因为我们有 [5,1] 作为项目 5 之一在 1 前面......同样我们创建相关项目通过压缩...
  • 这个想法似乎是一个路径。把路径放在一起......这肯定不是一个简单的逻辑......

标签: javascript arrays reduce


【解决方案1】:

我先说代码示例和描述不是很清楚,但我会拍一下……

看来你有 3 个要求:

  • 展平原始数组。
  • 过滤掉重复项。
  • 在扁平数组中对值进行分组(以某种方式?)。

列表中的前 2 个任务可以使用 reduce、concat、filter 和 indexOf 方法完成。

var multiArray = [ [1,2] , [5,1], [23,24], [3,4], [22,23], [2,3] ];

var flattened = multiArray.reduce(function (prev, curr) {
    return prev.concat(curr);
}, []);

var unique = flattened.filter(function (element, index, array) {
    return array.indexOf(element) === index;
});

但是,在您明确希望如何将这些值分组到展平数组中之前,我无法为您提供最后一项任务的示例。

我会在澄清后更新我的原始答案。

【讨论】:

  • 是的,我可以使用reduce进行展平,但在输出中 - 22,23,24 必须压缩到单独的数组中 - 因为它们与其余值没有任何连接.
【解决方案2】:

这是另一种解决方案,但我相信我可以用更少的代码和更多的功能来实现它。我不太喜欢使用forEach()reduced 之类的标志。这个递归地对数组项进行编码,直到没有任何东西可以编码。稍后我会再试一次,让它看起来更时尚。

var rawarr = [[1,2], [5,1], [23,24], [3,4], [22,23], [2,3]],
  encodarr = (arr) => {
    var reduced = false;
    arr.forEach((c,i,a) => {
      var sa = a.slice(i+1),
      j = sa.findIndex(f => c[0] == f[f.length-1] || c[c.length-1] == f[0]);
      arr[i] = !!~j ? c[0] == sa[j][sa[j].length-1] ? (reduced = true, a.splice(i+j+1,1)[0].concat(c.slice(1)))
                                                    : (reduced = true, c.slice(0,-1).concat(a.splice(i+j+1,1)[0]))
                    : c;
      return arr;
      });
    return reduced ? encodarr(arr) : arr;
  };

document.write("<pre>" + JSON.stringify(encodarr(rawarr)) + "</pre>");

【讨论】:

    【解决方案3】:

    基本上这个问题可以通过更多的循环和一个数组 (A) 或一个对象作为参考和一个循环 (B) 来解决。

    一个

    没有对象但有更多循环的原位提案。它用路径信息检查每个数组。如果找到匹配项,则两个数组是

    var data = [[1, 2], [5, 1], [23, 24], [3, 4], [22, 23], [2, 3], [4, 5]],
        result = function (data) {
            function first(a) { return a[0]; }
            function last(a) { return a[a.length - 1]; }
    
            var i = 0, j, t;
            outer: while (i < data.length - 1) {
                j = i + 1;
                while (j < data.length) {
                    t = data.splice(j, 1)[0];
                    if (first(data[i]) === last(t)) {
                        t.pop();
                        data[i] = t.concat(data[i]);
                        i = 0;
                        continue outer;
                    }
                    if (last(data[i]) === first(t)) {
                        t.shift();
                        data[i] = data[i].concat(t);
                        i = 0;
                        continue outer;
                    }
                    data.push(t);
                    j++;
                }
                i++
            }
            return data;
        }(data);
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

    B

    这是一个单循环提案,它包含所有部分并在可能的情况下附加它们。稍后将所有起始数组作为结果返回。

    var data = [[1, 2], [5, 1], [23, 24], [3, 4], [22, 23], [2, 3], [4, 5]],
        result = function (data) {
            var o = { start: {}, end: {} };
            data.forEach(function (a) {
                var temp;
                if (o.end[a[0]]) {
                    if (o.start[a[1]] && a[0] !== o.start[a[1]][o.start[a[1]].length - 1] && a[1] !== o.end[a[0]][0]) {
                        temp = o.end[a[0]].concat(o.start[a[1]]);
                        o.start[temp[0]] = temp;
                        o.end[temp[temp.length - 1]] = temp;
                        delete o.start[a[1]];
                    } else {
                        o.end[a[1]] = o.end[a[0]];
                        o.end[a[1]].push(a[1]);
                    }
                    delete o.end[a[0]];
                    return;
                }
                if (o.start[a[1]]) {
                    o.start[a[0]] = o.start[a[1]];
                    o.start[a[0]].unshift(a[0]);
                    delete o.start[a[1]];
                    return;
                }
                temp = a.slice();
                o.start[a[0]] = temp;
                o.end[a[1]] = temp;
            });
            return Object.keys(o.start).map(function (k) { return o.start[k]; });
        }(data);
    
    document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

    【讨论】:

    • 输入[[1, 2], [5, 1], [23, 24], [3, 4], [22, 23], [2, 3], [4,5]]时请检查结果
    猜你喜欢
    • 2016-02-18
    • 2018-02-19
    • 2015-09-03
    • 2019-01-23
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多