如何使用同一数组中的其他项目更改数组中的项目

时间:2018-12-11 21:05:59

标签: javascript arrays

我需要将数组A更改为类似于数组B,确保散列项成为任何数量的非散列项的前一个,直到下一个散列项为止

const A = [ '# test',
  'test',
  '# layouts',
  'main',
  'nav' ]

const B = ['test/test',
    'layouts/main',
    'layouts/nav' ]

3 个答案:

答案 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.reduceObject.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);