2016-10-18 3 views
-1

Мне нужно заменить строки в массиве. Сейчас я использую forEach -loop и switch, который не чувствует себя очень элегантно:Заменить строки в массиве

let result = []; 
source.forEach(el => { 
    switch (el) { 
     case 'replace': 
      result.push('with this'); break; 
     case ...: 
      ...; 
     default: 
      result.push(el); 
    } 
}); 
return result.join(','); 

То, что я хочу, чтобы это замена элементов с другой строкой или используя исходную строку, если не соответствует.

Исходный массив имеет 50 элементов, в заменяющем массиве 30 элементов.

ответ

1

В тех случаях, когда вы желаете один-в-один-манипуляцию массива, функция .map является предпочтительным:

return source.map(el => el === 'replace' ? 'with this' : el).join(','); 

EDIT Я вижу, что вы обновили этот вопрос и вы на самом деле 30 разных строк, которые вы хотите заменить. В этом случае вы должны использовать Map, который предварительно заполненный «до» и «после» строк:

let replaceFunc = (function() { 

    let replace = new Map([ 
     ['replace', 'with this'] 
    ]); 

    return source => source.map(el => replace.has(el) ? replace.get(el) : el).join(','); 
})(); 

IIFE используются для обеспечения одноразовой инициализации Map, и возвращаемая функция, закрывается над Map, назначается replaceFunc.

> replaceFunc(['replace']); 
"with this" 
+0

Часть 'new Map()' не работает для меня. Но я не понимаю, почему. Я не получаю ошибку, но я тоже не получаю никакого вывода. Разве 'replace.get (el)' нужен индекс? – user3142695

+0

Это работает для меня на Chrome 54 (я предположил, что вы используете современный браузер или интерпретатор, учитывая, что в вопросе использовался синтаксис стрелок ES6). Параметр 'replace.get()' является всего лишь ключом, поэтому в данном случае это слово из исходного массива. – Alnitak

1

map является альтернативой

var result = source.map(function (e) { 
    return e === 'replace' ? 'with this' : e; 
}); 
1

var sample = ["aaa", "bbb", "replaceMe", "ccc", "ddd"]; 
 
var result = sample.map(function(ele, inx) { 
 
    if (ele == "replaceMe") { 
 
     return "newText"; 
 
    } else { 
 
     return ele; 
 
    } 
 
}); 
 
console.log(result);