【问题标题】:Can create object by special Array string in Javascript?可以通过 Javascript 中的特殊数组字符串创建对象吗?
【发布时间】:2021-02-17 19:28:19
【问题描述】:

我有一个字符串数组:

["action=order_changed", "orderId=10002701", "brandId=5983e481fab80f4198691bbc", "unitId=5e801b6ddd43bb20cc2e5469", "isRepeat=false", "isDisplay=true"]

我想通过从数组中拆分= foreach 项来从中创建一个对象。

我预期的对象是:

{
    action: "order_changed",
    orderId: 10002701,
    brandId: "5983e481fab80f4198691bbc",
    unitId: "5e801b6ddd43bb20cc2e5469",
    isRepeat: false,
    isDisplay: true
}

我使用过 foreach,没有练习过 reduce,所以我的代码很糟糕。

splitStringParameter(str: string) {
  let stringQuery = str.split('?').pop(); 
  let arrayQuery = stringQuery.split('&'); 
  let object = {}; 
  arrayQuery.forEach(item => {
    item.split("="); 
    object[item[0]] = item[1]
  })
}

非常感谢

【问题讨论】:

  • order_changed 是字符串还是变量名?
  • 这是字符串 :D 感谢您的帮助
  • 更新了我的答案@phúphạm,现在我知道初始输入是一个查询字符串。

标签: javascript string object reduce


【解决方案1】:

您可以使用String.split 拆分键和值,并使用Array.prototype.reduce 将它们连接到一个新对象中。

const input = ["action=order_changed", "orderId=10002701", "brandId=5983e481fab80f4198691bbc", "unitId=5e801b6ddd43bb20cc2e5469", "isRepeat=false", "isDisplay=true"];

const output = input.reduce((acc, cur) => {
  const curArr = cur.split("=");
  const key = curArr[0];
  const value = curArr.splice(1).join("=");
  acc[key] = value;
  return acc;
}, {});
console.log(output);

【讨论】:

    【解决方案2】:

    更新(现在您提供了代码):

    看起来您的初始输入是一个查询字符串 - 查看URLSearchParams (MDN)

    var paramsString = "q=URLUtils.searchParams&topic=api";
    var searchParams = new URLSearchParams(paramsString);
    
    //Iterate the search parameters.
    for (let p of searchParams) {
      console.log(p);
    }
    
    searchParams.has("topic") === true; // true
    searchParams.get("topic") === "api"; // true
    searchParams.getAll("topic"); // ["api"]
    searchParams.get("foo") === null; // true
    searchParams.append("topic", "webdev");
    searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
    searchParams.set("topic", "More webdev");
    searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"
    searchParams.delete("topic");
    searchParams.toString(); // "q=URLUtils.searchParams"
    

    const a = ["action=order_changed", "orderId=10002701", "brandId=5983e481fab80f4198691bbc", "unitId=5e801b6ddd43bb20cc2e5469", "isRepeat=false", "isDisplay=true"];
    
    const transform = v => {
      if (v === 'false') {
        return false;
      }
      if (v === 'true') {
        return true;
      }
      
      return v;
    }
    
    const o = a.reduce((res, e) => {
      const [key, val] = e.split('=');
      res[key] = transform(val);
    
      return res;
    }, {});
    
    console.log(o);

    【讨论】:

    • @phúphạm 代码为 in your question,不在 cmets 中
    • 不幸的是,这不会将"true""false" 转换为布尔值
    • @Phil 很好。添加了处理布尔值的transform。整数更难。
    • 是的,所以我问如何解决它。它解决了。谢谢你:D
    • 太好了,我很高兴你解决了它!你想接受其中一个答案吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 2015-03-24
    • 2014-01-26
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多