鉴于此输入:
[
['a', 'b', 'c']
['b', 'c', 'd']
['a', 'd', 'b']
]
我想返回此输出:
[
['a', 'b', 'c']
[null, 'b', 'c', 'd']
['a', 'b', null, 'd']
]
这样每个数组中的每个匹配字符串都在数组中的相同位置,并且任何间隙都是空值。
上下文
我需要像上面那样渲染一堆任意字符串,但要确保列之间的每个公共字符串都在同一水平线上呈现。在此示例中,每个数组都是上图中的一列。一旦我正确设置了底层数组,我就可以使用简单的循环将字符串渲染到正确的位置。
答案 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