我需要将数组A更改为类似于数组B,确保散列项成为任何数量的非散列项的前一个,直到下一个散列项为止
const A = [ '# test',
'test',
'# layouts',
'main',
'nav' ]
const B = ['test/test',
'layouts/main',
'layouts/nav' ]
答案 0 :(得分:1)
您可以为此使用reduce
,累加器应该是一个包含两个值的对象,第一个将是结果数组,另一个将是要在reduce
中使用的当前哈希字符串生成路径。 reduce
完成工作后,我们可以将累加器的result
属性存储到结果变量B
中:
const B = A.reduce((acc, str) => { // for each string in the array A
if(str.indexOf("#") === 0) { // if the string is hashed one
acc.currentHash = str.slice(2); // set the current hash to this string
} else { // otherwise
acc.result.push(acc.currentHash + "/" + str); // use the current hash to generate the resulting string of the current string
}
return acc;
}, { result: [], currentHash: ""}).result; // once reduce finishes, use '.result' to access the result array of the accumulator
示例:
const A = [ '# test', 'test', '# layouts', 'main', 'nav' ];
const B = A.reduce((acc, str) => {
if(str.indexOf("#") === 0) {
acc.currentHash = str.slice(2);
} else {
acc.result.push(acc.currentHash + "/" + str);
}
return acc;
}, { result: [], currentHash: ""}).result;
console.log(B);
答案 1 :(得分:1)
我首选的方法是将数组映射到所需的格式,然后过滤掉无关的标记。
const needle = '# ';
let directoryName = '';
const b = a.map((elem) => {
if (elem.startsWith(needle)) {
directoryName = elem.substring(needle.length);
return;
}
return directoryName + '/' + elem;
}).filter(Boolean);
请注意,我已经对代码进行了优化以提高可读性。它将在数组上循环两次,这几乎可以肯定,因为此处的操作非常快。但是,如果您拥有庞大的阵列并需要每一个性能,那么易卜拉欣的答案会更合适。
答案 2 :(得分:0)
这是您可以采用的利用Array.prototype.reduce
和Object.keys
function modify(a, delimiter) {
const f = a.reduce((accum, el) => {
var s = el.replace(/\s/g, '');
if (s.charAt(0) === delimiter) {
accum.pointer = s.substring(1);
accum.data[accum.pointer] = [];
} else {
accum.data[accum.pointer].push(el);
}
return accum;
}, {
pointer: null,
data: {}
});
return Object.keys(f.data).map(k => {
var s = `${delimiter}${k}`
var values = f.data[k];
values.forEach(v => {
s += `/${v}`
});
return s;
});
}
const A = ['# test',
'test',
'# layouts',
'main',
'nav'
]
const B = modify(A, "#");
console.log(B);