2015-07-26 3 views
0

TL; 0: В принципе, я пытаюсь использовать Array.prototype.map(), чтобы вызвать метод, общий для списка объектов контекста.Как использовать метод map() для вызова, общий для списка объектов?

Скажем, у меня есть некоторый код, как это:

a.doSomething(); 
b.doSomething(); 
c.doSomething(); 
d.doSomething(); 
e.doSomething(); 
... 

Это слишком многословным. Я хочу, чтобы иметь возможность сократить этот код на что-то вроде этого

[a, b, c, d, e].map(doSomething); 

, потому что я не хочу, чтобы использовать for петлю.

Как я могу сделать это с помощью встроенной функции map в JS, без любых внешних библиотек?

Спасибо заранее! Если этот пост слишком длинный, я с радостью отредактирую его. Просто кричите на меня.

Похожие вопросы:

How to use map() to call class methods on a list of objects

How to call same method for a list of objects?

Я не использовал информацию в соответствующих вопросах, потому что Python и JS используют разные парадигмы и у меня нет уверенности в их Я буду работать так же. Если я ошибаюсь, пожалуйста, не стесняйтесь сожгать меня на костре.

дополнительную информацию, невнимание, если вы хотите:

Я alreadyRTFM, а формулировки и примеры показывают, что я не могу сделать выше, с map. Документы MDN описывают map как «вызов при условии функции на каждый элемент в массиве», в то время как документы MSDN говорят, что «вызывает функцию на каждый элемент массива и возвращает массив.» Я не пытаюсь вызвать метод на массив, я пытаюсь вызвать метод от несколько объектов контекста. Если это невозможно, существует ли нативный полиполк?

Я использую это в игре, поэтому скорость моя главная забота. Если есть более оптимальный способ закодировать это, пожалуйста, дайте мне знать!

ответ

1

Ответил, не задумываясь. Array#map поддерживается в большинстве браузеров сегодня и не относится к ES5. Смотрите ссылку MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

[1,2,3,4,5].map(function(item){ console.log(item)} 

напечатает:

1 
2 
3 
4 
5 

и вернуть неопределенными.Если вы возвращаете что-то вроде:

[1,2,3,4,5].map(function(item){return 2*item}) 

он вернется:

[2,4,6,8,10] 

Но это не обязательно ничего возвращать. Вы можете так же легко сделать forEach.

items.forEach(function(item){items.method()} 

Это все время O (n), потому что чтобы применить что-либо к n элементам в массиве, требуется не менее n времени. Для цикла так же хорошо, как и получается.

НЕПРАВИЛЬНО ES6 поддерживает #map, но это не на всех браузерах/Node.js без различных настроек быть установлен.

Underscorejs имеет эту функцию, если вы хотите использовать внешнюю библиотеку. См. Их картографическую документацию: http://underscorejs.org/#map

Я использую его в код сервера, никаких проблем. Возможно, вы должны работать в своей игре. Если время загрузки страницы является проблемой, вы всегда можете расширить прототип Array самостоятельно.

+0

«Смотрите ссылку MDN:» Я связала очень вашу ссылку на мой вопрос. Но спасибо вам большое! Вы кратко ответили на все мои вопросы! Ты спасатель. –

+1

ах, я не парил над вашим «уже» :) Рад, что это помогло! –

+0

MDN и MSDN - мои ссылки. –

1

вызов данной функции для каждого элемента массива. Вот где анонимные функции могут быть очень уместно:

[a, b, c].map(function (item) { item.doSomething(); }); 
+0

Большое спасибо, сэр! Некоторое время я подбрасывал эту идею в голове, но я не мог видеть, как она работает, как я ожидал. Как бы вы назвали 'doSomething()' аргументами? Я бы использовал встроенный массив 'arguments'? –

+0

Я вижу, что вы показали мне это, и я уверен, что несколько аргументов будут работать аналогичным образом. Не стесняйтесь, чтобы поместить меня в dunking пул сейчас! –

+0

Рад, если это поможет. – Tony

2

Ближайший я могу думать о

[a, b, c, d, e].forEach(function(item) {item.doSomething()}); 

с помощью [] .map было бы бессмысленно для вашей цели

редактирования, вы можете также сделать что-то вроде этого

Array.prototype.fnName = function(methodName) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    this.forEach(function(item) { 
     item[methodName].apply(item, args); 
    }); 
}; 

Я использовал fnName, вы могли бы назвать I т fnMap или что-то другое, что имеет смысл для вас

вы бы использовать его как

[a,b,c].fnName('doSomething', param1, param2 ...) 
+0

Мне было интересно, может ли это работать так же, как 'map'. Большое спасибо, сэр, спасибо! –

Смежные вопросы