2016-02-08 4 views
2

Любые советы по тому, как я могу реорганизовать свою функцию с помощью reduce, так как я не должен использовать map здесь?Использование уменьшения fnt вместо карты

+0

И почему бы вам просто не использовать карту для сопоставления массива, реальный вопрос в том, почему вы не возвращаете этот массив, вместо того, чтобы переходить к новому массиву внутри функции 'map' – adeneo

+1

Почему редактирование для удаления оригинальный код? Без него вопрос не одинок. –

ответ

3

Попробуйте это:

function serializeParams (object) { 
    return Object.keys(object) 
     .reduce((query, key) => 
      Array.isArray(object[key]) 
       ? query.concat(object[key].map(value => `${key}=${encodeURIComponent(value)}`)) 
       : query.concat(`${key}=${encodeURIComponent(object[key])}`) 
     , []) 
     .join('&'); 
} 

Или без строки шаблона:

function serializeParams (object) { 
    return Object.keys(object) 
     .reduce((query, key) => 
      Array.isArray(object[key]) 
       ? query.concat(object[key].map(value => key + '=' + encodeURIComponent(value))) 
       : query.concat(key + '=' + encodeURIComponent(object[key])) 
     , []) 
     .join('&'); 
} 
+0

точно! Спасибо – sisimh

2

Использование map вместо reduce уместно здесь, вы только должны сопоставить массив массивов, которые вы можете concat перед тем join ING.

function serializeParams(obj) { 
    return Array.protoype.concat.apply([], keys(obj).map(key => { 
    let value = obj[key]; 
    return Array.isArray(value) 
     ? value.map(v => key +"=" + encodeURIComponent(v)) 
     : [key + "=" + encodeURIComponent(value)]; 
    })).join("&"); 
} 

Поскольку вы помечено это с Ramda, вы можете составить map с concat или использовать chain сразу.

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