2012-06-13 5 views
8

У меня есть массив каналов, что я хочу, чтобы преобразовать в один объект (channelSettings) с истинным/ложным собственности для каждого канала.Как построить объект javascript, используя массив и функцию карты?

У меня это работает, используя приведенный ниже код, но он выглядит многословным. Есть ли способ сделать это без «temp» var? Если мне удастся прокатиться на этом, я тоже смогу прокатиться по собственной функции.

var channels = ["TV", "Billboard", "Spot TV"]; 


var channelSettings = function() { 
    var temp = {}; 

    channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     temp[channel] = false; 
    }); 

    return temp; 
}(); 

Я думаю, я пытаюсь вернуть функцию карты, чтобы вернуть объект со свойствами вместо массива. Это возможно? Это неправильно? Предложения?

Это то, что я надеюсь, что это выглядит в конце:

var channels = ["TV", "Billboard", "Spot TV"]; 

var channelSettings = channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     return ????; 
}); 
+1

Это может быть немного многословен, но это также _clear_. Я бы проголосовал за то, чтобы оставить его как есть. –

ответ

7

Используйте вместо этого функцию .reduce().

var channelSettings = channels.reduce(function(obj, itm) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     obj[channel] = false; 

     return obj; 
}, {}); 

DEMO:http://jsfiddle.net/MjW9T/


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

Второй параметр ссылается на текущее значение в массиве. Пока мы всегда возвращаем obj, первым параметром всегда будет этот объект, а также конечное возвращаемое значение.

+0

Хорошее объяснение, Thx! – DanielEli

+0

@ DanielEli: Добро пожаловать. –

0

хмм .. похоже, окружив его функции, как это будет делать.

function toObject(arr) { 
    var rv = {}; 
    for (var i = 0; i < arr.length; ++i) 
    if (arr[i] !== undefined) rv[arr[i]] = true; 
    return rv; 
} 
3

Функция map принимает массив и возвращает массив. Ничего больше. Но вы можете использовать reduce:

var settings = ["TV", "Billboard", "Spot TV"].reduce(function(obj, item) { 
    obj[item.toLowerCase().replace(" ", "")] = false; // probably too concise 
    return obj // yay, we can skip a semi-colon here :-P 
}, {}); 

Ну, «я не я» бить меня к нему, но все равно:
map не только возвращает массив, но и только возвращает массив той же длины, что и оригинал. Он предназначен для преобразования значений одного массива 1: 1 в новый массив. reduce предназначен для «уменьшения массива до одного значения». Отсюда его использование здесь.

Если вы используете прямой цикл for или метод forEach для добавления свойств объекта, вам необходимо объявить этот объект. Итак, нет, вы не можете обойтись без temp в своем коде (если вы не используете reduce вместо цикла).

Более подробную информацию о MDN:

  1. карта: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. уменьшить: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce
+0

и отличное объяснение здесь тоже! (Мне не пришлось бы защищать мою проверку зеленых чеков в суде ..) много thx! – DanielEli

+0

@RobG Ах, ссылки MDN - я совсем забыл добавить их. Спасибо за редактирование – Flambino

+0

В итоге я использовал более понятную версию. var key = item.toLowerCase() заменить ("", ""); obj [key] = false; return obj – DanielEli