Выполнение функции для каждого ключа в массиве без цикла - PullRequest
1 голос
/ 02 июня 2011

Я ищу наилучшую практику для выполнения encodeURIComponent (или какой-либо другой функции) для каждого ключа в массиве, прежде чем объединять его в одну строку.

Это можно сделать с помощью цикла, подобного этому:

var dynamicArray = ['uri1', 'uri2', 'hax&%hax'];
var max = dynamicArray.length,
i,
url = '';

for (i=0;i<max;(i++))
{
   url += '/' + encodeURIComponent(dynamicArray[i]);
}

alert(url);

/* RESULT: /uri1/uri2/hax%26%25hax */

Но я ищу что-то вроде этого (без цикла):

encodeURIComponent(dynamicArray).join('/'); /* This won't work */
encodeURIComponent(dynamicArray.join('/')); /* Can't do this, wrong result */

Ответы [ 2 ]

4 голосов
/ 02 июня 2011
dynamicArray.map(encodeURIComponent).join('/');

Проверьте MDC для реализации map для несовместимых платформ.
Конечно, внутри реализации map есть цикл.

2 голосов
/ 02 июня 2011

Ну, в некоторых современных браузерах есть метод ".map ()" для массивов:

var encoded = dynamicArray.map(function(str) {
  return encodeURIComponent(str);
});

или без вашей собственной функции-оболочки, которая в данном случае на самом деле не нужна:

var encoded = dynamicArray.map(encodeURIComponent);

Идея состоит в том, что .map () вызывается для каждого элемента массива. Переданная функция должна возвращать некоторый результат, и эти результаты собираются в массив new , который в конечном итоге является возвращаемым значением. Затем вы можете сделать это ".join ()" или сделать все, что вам нужно.

Документация Mozilla для ".map ()" содержит блок кода "polyfill", который можно использовать для предоставления ".map ()" в браузерах, которые его не поддерживают. Также обратите внимание, что многие служебные библиотеки имеют свои собственные .map (), а некоторые из них имеют немного другую семантику. Например, jQuery ".map ()" имеет (мне неприятно) семантику для возвращаемых значений из функции обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...