2013-09-11 5 views
0

Вот мое первоначальное решение вопроса изучения заполнения объекта элементами из массива ... Но похоже, что должно быть более приятное решение. Я читал, где «для ... в» не подходит, но нет ли лучшего метода, который я забываю?Можно ли выполнить эту итерацию с помощью более удобного метода?

var doubler = function(arr) // fills object with numbers and their doubled value 
{ 
    var my_obj = {}; 
    for(var i=0; i<arr.length; i++) 
    { 
     my_obj[arr[i]] = arr[i]*2;  
    } 
console.log(my_obj); 
} 

doubler([5,7,2,3,4,7]) 
+3

Этот вопрос не соответствует теме, поскольку он просит улучшения существующего рабочего кода; он, вероятно, принадлежит на codereview.stackexchange.com –

+0

Алекс, что должно быть не по теме? Код в вопросе только иллюстрирует тип проблемы, которую нужно решить, в то время как ответ Алнитак дает необходимые шаги. –

+0

Намерение не было «работает ли этот код?». Это был «какой новый метод я изучаю, чтобы перейти на следующий уровень». – dwilbank

ответ

2

Для удовольствия, используя Array.prototype.reduce:

function doubler(a) { 
    return a.reduce(function(o, n) { 
     o[n] = n * 2; // adds required key and value to object 
     return o;  // returns filled object 
    }, {});   // start with an empty object 
} 

reduce принимает массив, и начальное значение ({}) и выполняет некоторую операцию по очереди на каждое значение массива и результат o f предыдущая итерация (где a [0] и {} используются для первой итерации).

Я немного злоупотребляю здесь, вызывая побочные эффекты (назначение объекту) и просто беря начальный объект (o == {}) и возвращая тот же (измененный) объект на каждой итерации.

Более идиоматическое использование reduce бы это:

function addUp(a) { 
    return a.reduce(function(running_total, n) { 
     return running_total + n; 
    }, 0); // 0 is actually the default value 
} 
+0

Это напуганный материал, о котором я говорил.Теперь я должен посмотреть, какие фигурные скобки находятся в конце. – dwilbank

+1

@dwilbank. Я уже добавил некоторые комментарии, которые должны объяснить это: это начальное значение 'o' – Alnitak

+0

@dwilbank FWIW, это _probably_ не самый быстрый кода в мире, но я люблю эти методы «функционального программирования» на массивах :) – Alnitak

1

Ваш код в порядке и в порядке. Я рекомендую только кэшировать arr.length:

for(var i=0, len=arr.length; i<len; i++) 

и, возможно, двойной поиск:

var item = arr[i]; 
my_obj[item] = item*2;  
1

Прежде всего, я люблю всегда объявлять переменную для текущего элемента массива:

for(/*...*/){ 
    var x = arr[i]; 
    /*...*/ 
} 

его не большой сделки, но это избавит меня от повторного набора arr [i]. Кроме этого, ваш текущий код отлично подходит, и, возможно, единственное, что нужно изменить, это незначительные улучшения производительности, такие как кеширование длины массива.

Это говорит, одна вещь, которую вы могли бы рассмотреть использует функцию итератора вместо цикл:

arr.forEach(function(x, i){ 
    my_obj[x] = x*2; 
}); 

Это имеет преимущество автоматического создания лексически контекстные переменные цикла, и вы не должны ссылаться на массив более одного раза (полезно, если это выражение вместо просто ссылки на переменные).

Важнейшим предостережением этого подхода является то, что вы не можете использовать break, continue и return для потока управления, как вы могли бы в регулярном цикле. Кроме того, существует небольшое ограничение производительности при вызове дополнительных функций, а некоторые старые браузеры не поддерживают методы итерации массива как встроенные, поэтому вам нужно использовать прокладку или библиотечную функцию.

+0

Спасибо. Теперь мне нужно учиться для каждого! – dwilbank

+0

@dwilbank: мой путь, большинство библиотек Javascript (подчеркивание и т. Д.) Должны включать в себя эти функции итератора, поэтому вам не придется выполнять их самостоятельно. – hugomg

+0

ах - Я вижу, как он сортирует вещи, как им нравится, вместо того, чтобы хранить порядок массива. Ценный урок. – dwilbank

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