代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

如何将一个JavaScript对象数组转换为只有一个循环的URL字符串?

  •  0
  • Razvan Zamfir  · 技术社区  · 3 年前

    我正试图将一组JavaScript对象转换为带有params的URL字符串,如下所示:

    const objects = [{
        firstName: "John",
        lastName: "Doe",
        age: 46
      },
      {
        country: "France",
        lastName: "Paris"
      }
    ]
    
    let entry_arr = [];
    
    objects.forEach(obj => {
      Object.entries(obj).forEach(entry => {
        entry_arr.push(entry.join('='));
      });
    });
    
    let entry_str = entry_arr.join('&');
    
    console.log(entry_str);

    从表面上看,上面的代码是有效的。有一个 问题 虽然

    这个问题

    正如你所看到的,我有两个嵌套 forEach 循环。为了获得更好的性能,我希望我知道如何避免这种嵌套,而只使用一个 对于每个

    我怎样才能在一个循环中获得相同的结果?

    2 回复  |  直到 3 年前
        1
  •  2
  •   Juljo Shahini    3 年前

    将数组中的每个对象合并到一个主对象中是我能想到的唯一解决方案。(我以为姓:paris是个拼写错误)

    const objects = [{
        firstName: "John",
        lastName: "Doe",
        age: 46
      },
      {
        country: "France",
        city: "Paris"
      }
    ]
    
    const obj = objects.reduce((acc, obj) => Object.assign(acc, obj), {});
    
    const entry_str = Object.entries(obj).map(entry => 
        entry.join('=')
      ).join('&');
    
    console.log(entry_str);
        2
  •  1
  •   Fiodar Shurankou    3 年前

    Nina stil提供的答案使用嵌套循环,而不是使用forEach,而是使用map。

    对于特殊字符处理,我强烈建议使用 URLSearchParams

    我建议使用reduce将对象数组连接到一个对象中,并导入 URLSearchParams

    const objects = [
        { firstName: "John", lastName: "Doe", age: 46 }, { country: "France", lastName: "Paris" }];
    let reduced = objects.reduce((acc, object) => Object.assign(acc, object))
    let params = new URLSearchParams(reduced);
    
    console.log(reduced);
    console.log(params.toString());
        3
  •  0
  •   Nina Scholz    3 年前

    至少,您需要使用连接键和值映射条目,并连接嵌套的条目和外部数组。

    const
        objects = [{ firstName: "John", lastName: "Doe", age: 46 }, { country: "France", lastName: "Paris" }],
        result = objects
            .map(object => Object
                .entries(object)
                .map(entry => entry.join('='))
                .join('&')
            )
            .join('&');
    
    console.log(result);