最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Convert string into key-value pairs in an array - Stack Overflow

programmeradmin0浏览0评论

I have a string:

var rrule = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

I want to convert this string to key-> value pairs in an array.

[
  dtstart: 20190514T111500Z, 
  freq: daily,
  interval: 1
]

I know I can take the string and split it based on the semicolon:

var array = rrule.split(";");

... but this leaves me with an array like this:

[
  "DTSTART=20190514T111500Z",
  "FREQ=DAILY",
  "INTERVAL=1"
]

I guess I need another step to map out the keys/values, but I get lost at this point.

Ideally, for the string I want to be able to easily access what dtstarts equals, what interval equals, what other variables equal and so on.

I have a string:

var rrule = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

I want to convert this string to key-> value pairs in an array.

[
  dtstart: 20190514T111500Z, 
  freq: daily,
  interval: 1
]

I know I can take the string and split it based on the semicolon:

var array = rrule.split(";");

... but this leaves me with an array like this:

[
  "DTSTART=20190514T111500Z",
  "FREQ=DAILY",
  "INTERVAL=1"
]

I guess I need another step to map out the keys/values, but I get lost at this point.

Ideally, for the string I want to be able to easily access what dtstarts equals, what interval equals, what other variables equal and so on.

Share Improve this question edited Jun 3, 2019 at 14:30 Rory McCrossan 338k41 gold badges320 silver badges351 bronze badges asked Jun 3, 2019 at 14:28 chris.cavagechris.cavage 8811 gold badge17 silver badges38 bronze badges 4
  • 2 You want to turn it into an array or an object? Your desired "array" is invalid – Nick Parsons Commented Jun 3, 2019 at 14:29
  • So Arrays don't have user defined keys. You might want to have convert to an object. Like { dtstart: 2019...., .... } – FullStackEngineer Commented Jun 3, 2019 at 14:31
  • 1 Use a second string split and you have it: rrule.split(";").map(function (str) {return str.split("=")}) – Danmoreng Commented Jun 3, 2019 at 14:32
  • Sorry, you are correct, I would want to convert it to an object like { dtstart: 2019...., .... } – chris.cavage Commented Jun 3, 2019 at 14:58
Add a ment  | 

8 Answers 8

Reset to default 7

let str = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

let obj = {};
for (let entry of str.split(";")) {
  let pair = entry.split("=");
  obj[pair[0]] = pair[1];
}

console.log(obj);

You already know how to split on the ; to get an array, from there you can just aggregate (using reduce) to get an object:

var rrule = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

var result = rrule.split(";").reduce( (obj,item) => {
   let [key,value] = item.split("=");
   obj[key] = value;
   return obj;
},{});

console.log(result["DTSTART"])
console.log(result["FREQ"])
console.log(result["INTERVAL"])

You were correct to start with split first, this would then return you an array of strings.

To easily convert them, just use map, to return the split the single strings once more, and then return an object based on the property name you would like to give it and it's value

function createKeyValuePairFromString( str ) {
  return str.split(';').map( item => {
    const splitted = item.split('=');
    return { [splitted[0]]: splitted[1] };
  });
}

console.log( createKeyValuePairFromString("DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1") );

Use array created and split it again with =

function convertToObject(cookieString) {
  const cookieObj = {};
  if (!cookieString && typeof cookieString !== 'string') return cookieObj;

  const arr = cookieString.split(';');
  arr.forEach(record => {
    if (record.includes('=')) {
      const [key, value] = record.split('=');
      cookieObj[key.trim()] = value;
    }
  });
  return cookieObj;
}

You can use it like the code below:

var rrule = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";
let finalObj = {};
rrule.split(';').forEach(i => finalObj[i.split('=')[0]] = i.split('=')[1]);
console.log('finalObj',finalObj);

Here I'm first splitting with ';' so consider the first item to be DTSTART=20190514T111500Z Then on splitting with = I get finalObject['DTSTART'] = 20190514T111500Z

Using forEach()

let str = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

let obj = {};

let strArr = str.split(';')

strArr.forEach((str) => {
  let [key, value] = str.split('=')
  obj[key] = value;
});

console.log(obj);

Here's a fairly simple version, returning an object, not an array:

const toObj = str => str
  .split (';')
  .map ( s => s .split ('=') )
  .reduce ( (a, [k, v]) => ({...a, [k]: v}), {} )

let str = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

console.log (
  toObj(str)
)

One of the reasons I like the library is that we can write this sort of logic more simply. In Ramda (disclaimer: I'm one of the authors), it might look like this:

const toObj = pipe ( split (';'), map (split ('=') ), fromPairs)

let str = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

console.log (
  toObj(str)
)
<script src="https://bundle.run/[email protected]"></script><script>
const {pipe, split, map, fromPairs} = ramda;               </script>

var str = "DTSTART=20190514T111500Z;FREQ=DAILY;INTERVAL=1";

// string splitting rule

const rule = (string, delimiter) => string.split(delimiter);

const result = rule(str, ';').reduce((acc, s) => {
  const [key, value] = rule(s, '=');
  acc[key] = value;
  return acc;
}, {});

console.log(result);
发布评论

评论列表(0)

  1. 暂无评论