2013-08-06 3 views
2

Есть ли ярлык для доступа к элементам массива с использованием массива индексов, а не по одному индексу за раз?Javascript - Доступ к элементам массива с использованием массива индексов

Пример (это не работает):

var array = ["One", "Two", "Three", "Four"]; 
var indices = [1, 3]; 
var result = array[indices]; 

, где результат будет [ "Два", "четверка"].

+1

Неа. Нет. –

+1

вы можете расширить массив с помощью функции, имеющей эту функцию. –

ответ

2

Вы можете сделать его доступным для всех массивов, если у вас нет проблем с распространением собственных прототипов в вашей среде.

Array.prototype.atIndices = function(ind) { 
    var result = []; 
    for (var i = 0; i < arguments.length; i++) { 
     if (arguments[i] in this) 
      result.push(this[arguments[i]]) 
    } 
    return result;   
} 

var result = array.atIndices(1,3); 

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

Array.prototype.atIndices = function(ind) { 
    var result = []; 
    for (var i = 0; i < arguments.length; i++) { 
     if (Array.isArray(arguments[i])) 
      result.push.apply(result, this.atIndices.apply(this, arguments[i])) 
     else if (arguments[i] in this) 
      result.push(this[arguments[i]]) 
    } 
    return result;   
} 

Это фактически расплющить все Массивы, чтобы они могли быть настолько глубоко вложенными, как вы хотите.

var result = array.atIndices(1, [3, [5]]); 
+0

Обратите внимание, что вам не нужно расширять 'Array.prototype', и вам, вероятно, не стоит этого делать. Просто делает сигнатуру функции принимающей массив как аргумент. – plalx

+0

@plalx: На самом деле нет необходимости или не должно. Если вы строите публичную библиотеку, это, вероятно, не самая лучшая идея, но, кроме этого, она полностью зависит от решений, принимаемых индивидуальной или коллективной средой разработки. –

+0

Ну, большинство современных библиотек предполагает, что прототипы не изменяются. На мой взгляд, вам следует избегать модификации прототипов собственных объектов, даже если вы полностью контролируете среду разработки, если она никогда не будет открыта для сторонних библиотек, и даже тогда упрощение API будет таким, как небольшое преимущество. 'array.atIndices (1)' не намного проще, чем 'someNS.atIndices (array, 1)'. – plalx

2

Теперь есть:

function pluck(arr, indices) { 
    var result = [], 
     i = 0, 
     len = indices.length; 

    for (; i < len; i++) { 
     result.push(arr[indices[i]]); 
    } 

    return result; 
} 
0

В качестве альтернативы прокатки самостоятельно, если у вас есть доступ к Lo-тиру (который вы должны полностью использовать, потому что это является удивительным) его at функция делает именно что ты хочешь.

Ваше использование будет:

var result = _.at(array, indices); 

См: http://lodash.com/docs#at