使用 reduce fnt 而不是 map

Using reduce fnt instead of map

关于如何使用 reduce 重构我的函数的任何建议,因为我不应该在这里使用 map

试试这个:

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('&');
}

在这里使用 map 而不是 reduce 是合适的,您只应在 joining 之前映射到您可以 concat 的数组数组。

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 with concat or use chain