在同一索引中将公共数组元素对齐在一起

时间:2018-04-20 15:05:47

标签: javascript arrays algorithm

鉴于此输入:

[
    ['a', 'b', 'c']
    ['b', 'c', 'd']
    ['a', 'd', 'b']
]

我想返回此输出:

[
    ['a',  'b', 'c']
    [null, 'b', 'c',  'd']
    ['a',  'b', null, 'd']
]

这样每个数组中的每个匹配字符串都在数组中的相同位置,并且任何间隙都是空值。

上下文

enter image description here

我需要像上面那样渲染一堆任意字符串,但要确保列之间的每个公共字符串都在同一水平线上呈现。在此示例中,每个数组都是上图中的一列。一旦我正确设置了底层数组,我就可以使用简单的循环将字符串渲染到正确的位置。

4 个答案:

答案 0 :(得分:1)

您可以使用Set方法和一个ES6 const input = [['a', 'b', 'c'],['b', 'c', 'd'],['a', 'd', 'b']] const all = new Set const result = input.reduce((r, arr) => { arr.forEach(e => all.add(e)) r.push([...all].sort().map(e => arr.includes(e) ? e : null)) return r; }, []); console.log(result)来保留当前值。

Date = ['2015-Q1, '2013-Q4', '2017-Q2', '2018-Q1']

答案 1 :(得分:1)

此版本在任何可能适用的地方都包含null,包括在第一行的末尾。

const transform = (orig) => {
  const template = Array.from(new Set(orig.reduce((a, b) => a.concat(b))))
  return orig.map(row => row.slice(0).reduce( // `slice` to avoid mutating original
    (output, val) => {
      const idx = template.indexOf(val)
      output[idx] = val
      return output
    } , Array(template.length).fill(null)
  ))
}

const orig = [['a', 'b', 'c'], ['b', 'c', 'd'], ['a', 'd', 'b']]

console.log(transform(orig))

如果您希望对值进行排序,则只需在第一行末尾添加sort调用:

   const template = Array.from(new Set(orig.reduce((a, b) => a.concat(b)))).sort()

实际上,它们按照第一次看到值的时间排序。

模板只是从所有行的串联中获取唯一值的结果,在本例中为['a', 'b', 'c', 'd'],它用于告诉代码的其余部分在每行中放置给定的位置值。

您可以再次map再次删除任何尾随null,但如果它们不是问题,我认为这不值得。

答案 2 :(得分:0)

 for(let i = 0; i < table[0].length; i++) {
   const match = table[0][i];
   for(const row of table.slice(1)) {
     if(row[i] !== match) {
       row.splice(i, 0, null);
     }
   }
 }

答案 3 :(得分:0)

创建一个包含所有可能值的“中间”数组,从那里路径非常简单:

themes/your_theme/shopping-cart.tpl