简体   繁体   English

JavaScript格式化类似于数组对象的字符串

[英]JavaScript format a string like array object

In JavaScript I have a string like 在JavaScript中,我有一个像

Package=sdvasd&Qty=1&Price=34?Package=sdabhjds&Qty=1&Price=234?

I want to format that like an object array like this 我想像这样的对象数组格式化

[
{'Package' : 'sdvasd', 'Qty' : 1, 'Price' : 34 }
{'Package' : 'sdabhjds', 'Qty' : 1, 'Price' : 234 }
]

The code what I have tried so far 到目前为止我尝试过的代码

let packageData = data.split('?');
let packageArr = [];
if( packageData.length > 0 ) {
  for (var i = 0; i < packageData.length -1; i++) {
    let str = packageData[i].split('&');
    for (var j = 0; j < str.length; j++) {
      let keys = str[j].split('=');
      packageArr.push(keys[1])
    }
  }
}
console.log(packageArr);

But it is not giving me result like this. 但这并没有给我这样的结果。 Can someone tell me how to make this like the desired output. 有人可以告诉我如何使它像所需的输出。 Any suggestions and advice will be really appreciable. 任何建议和意见将是非常可观的。 I only want javascript method not jQuery 我只想要javascript方法而不是jQuery

Use split , map and reduce 使用splitmapreduce

var output = str.split("?") //split by ?
   .filter( s => !!s ) //filter out empty 
   .map( s => s.split( "&" ) //split by & and iterate each item
   .reduce( (acc, c) => 
          ( t = c.split("="), acc[t[0]] = t[1], acc) //split each item by = and set each key to accumulator and return the accumulator
   , {}) ); //initialize accumulator

Demo 演示版

 var str = "Package=sdvasd&Qty=1&Price=34?Package=sdabhjds&Qty=1&Price=234?"; var output = str.split("?") //split by ? .filter( s => !!s ) //filter out empty .map( s => s.split( "&" ) //split by & and iterate each item .reduce( (acc, c) => ( t = c.split("="), acc[t[0]] = t[1], acc) //split each item by = and set each key to accumulator and return the accumulator , {}) ); //initialize accumulator console.log( output ); 

You could split the string and create for the outer splitting an array and for inner splitting the object and for the most inner splitting a key/value pair. 您可以拆分字符串,然后为外部拆分数组,内部拆分对象以及最内部的键/值对创建拆分。

 var string = 'Package=sdvasd&Qty=1&Price=34?Package=sdabhjds&Qty=1&Price=234?', result = string .split('?') .filter(Boolean) .map(s => s.split('&').reduce((o, p) => { var [k, v] = p.split('='); return Object.assign(o, { [k]: v }); }, {})); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

You can use this. 您可以使用它。 Also you can check for number values so that the qty and Price properties has numeric values and not string: 您还可以检查number值,以便qtyPrice属性具有数字值而不是字符串:

 var str = 'Package=sdvasd&Qty=1&Price=34?Package=sdabhjds&Qty=1&Price=234'; var resArray = []; str.split('?').filter((obj)=>{ var resObj = {}; obj.split('&').map((item)=>{ var itemSplit = item.split('='); if(isNaN(itemSplit[1])){ resObj[itemSplit[0]] = itemSplit[1]; } else { resObj[itemSplit[0]] = parseInt(itemSplit[1]); } }); resArray.push(resObj); }); console.log(resArray); 

Try the below code. 试试下面的代码。 Create a object and then put the key value pairs. 创建一个对象,然后放置键值对。

    let packageArr = [];
let packageDataArr = data.split('?');
Array.prototype.forEach.call(packageDataArr,(packageData)=>{
   let dataObj = {};
   let str = packageData.split('&');
   Array.prototype.forEach.call(str,(keyValue)=>{
      let keys = keyValue.split('=');
      dataObj[key[0]] = key[1];
   });
   packageArr.push(dataObj);
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM