将字符串转换为数组中的键/值对

时间:2019-06-03 14:28:06

标签: javascript jquery

我有一个字符串:

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

我想将此字符串转换为数组中的key->值对。

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

我知道我可以将字符串作为字符串并根据分号进行分割:

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

...但是这给我留下了一个像这样的数组:

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

我想我还需要一步来绘制键/值,但是到那时我迷路了。

理想情况下,对于字符串,我希望能够轻松访问dtstarts等于什么,区间等于什么,其他变量等于什么,等等。

9 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:0)

您已经知道如何在;上拆分以获取数组,您可以从那里聚合(使用reduce)以获取对象:

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"])

答案 2 :(得分:0)

您可以像下面的代码一样使用它:

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);

在这里,我先用';'分割因此,考虑第一项为DTSTART=20190514T111500Z,然后在与=分割时得到finalObject['DTSTART'] = 20190514T111500Z

答案 3 :(得分:0)

首先从split开始是正确的,然后将返回一个字符串数组。

要轻松地转换它们,只需使用map,再次返回分割的单个字符串,然后根据您想要提供的属性名称及其值返回一个对象

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") );

答案 4 :(得分:0)

使用创建的数组,并使用=

再次拆分
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;
}

答案 5 :(得分:0)

使用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);

答案 6 :(得分:0)

这是一个相当简单的版本,返回一个对象,而不是一个数组:

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)
)

我喜欢该库的原因之一是我们可以更简单地编写这种逻辑。在Ramda中(免责声明:我是作者之一),它可能看起来像这样:

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

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

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

答案 7 :(得分:0)

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

//字符串分割规则

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);

答案 8 :(得分:-2)

首先用;分割字符串

var res = rrule.split(';')

然后用'='分隔每个字符串

res = res.map(i => i.split('='))