字符串到JS对象数组

时间:2019-06-04 12:27:01

标签: javascript arrays string object

我有一个类似的字符串:

"{id:1,another:thing},{id:2,another:item}"

如何在JS中将其转换为对象数组[{...},{...}]

编辑

  • 很多评论都说字符串不是有效的JSON-我没有声称它是。我意识到尽管有一个JSON标签到问题。我不好。
  • 我知道我可以将字符串格式化为类似于JSON的格式。我没有自由修改字符串。
  • 由于上述两个原因,问题与假定的重复项不同。

2 个答案:

答案 0 :(得分:3)

使用这种格式,您几乎可以转换为对象。它不是有效的JSON,但如果我们尝试解决问题,它就很容易:

  1. 将对象分离,因此从"{id:1,another:thing},{id:2,another:item}"中可以得到一个数组,其中每个项目都是“对象”,并且仅包含键值将是的->因此,每个项目都是“ {id:1,另一个:事}”
  2. 然后,每个“对象字符串”实际上都被拆分为键和值{id:1,another:thing}-> "id:1""another:thing"的字符串
  3. 键值字符串可以分为键值"id:1"-> "id""1"

因此,这将为您提供一个蓝图,其中包含每个对象的构造块及其键和值。这就是

的工作方式

let input = "{id:1,another:thing},{id:2,another:item}";

//capture objects like "{id:1,another:thing}"
const regexForObjects = /\{[^}]*\}/g;

let objectBlueprint = input
  .match(regexForObjects) //split off each "object" as a string
  .map(objString => objString.slice(1, -1)) //remove the first { and the last }
  .map(item => item.split(/\s*,\s*/)) // split each string representation of an object into strings for each key and value
  .map(item => item.map(subitem => subitem.split(/\s*:\s*/))) //split each key-value pair into a separate array.

console.log(objectBlueprint)

这很冗长-可以通过其他方式完成实现,但这可以通过执行以下步骤来了解正在发生的事情。

完成此操作后,剩下的就是从此构建对象。每个对象都由一个包含键值对数组的数组表示,因此我们可以非常简单地实现一个函数,接受该值并返回一个对象:

let input = [ ["id", "1"], ["another", "thing"] ];

let output = fromArrayToObject(input);

console.log(output)

function fromArrayToObject(keyValuePairs) {
  return keyValuePairs.reduce((obj, [key, value]) => {
    obj[key] = value;
    
    return obj;
  }, {})
}

现在,这只会产生字符串作为值。很难猜测"1"是字符串还是数字。这是最低限度的实现,但是您也可以尝试猜测值的类型:

let number = guessType("1");
let boolean = guessType("true");
let nul = guessType("null");
let string1 = guessType("The quick brown fox");
let string2 = guessType("something");

console.log("should be number:", typeof number);
console.log("should be boolean:", typeof boolean);
console.log("should be null:", nul === null); //typeof null -> "object", so doing an equality check
console.log("should be string:", typeof string1);
console.log("should be string:", typeof string2);

function guessType(value) {
  try {
    return JSON.parse(value)
  } catch (e) {
    return value;
  }
}

这很简单,但是可以在很多情况下使用。如果可以将字符串解析为原语,则为该原语。如果不能,则将其视为普通字符串。

将所有内容放在一起,如下所示:

let input = "{id:1,another:thing},{id:2,another:item}";

//convert into the structure to build into objects
let objectBlueprint = input
  .match(/\{[^}]*\}/g)
  .map(objString => objString.slice(1, -1))
  .map(item => item.split(/\s*,\s*/))
  .map(item => item.map(subitem => subitem.split(/\s*:\s*/)));

//convert each object
let output = objectBlueprint.map(fromArrayToObject)

console.log(output);


function fromArrayToObject(keyValuePairs) {
  return keyValuePairs.reduce((obj, [key, value]) => {
    obj[key] = guessType(value);

    return obj;
  }, {})
}

function guessType(value) {
  try {
    return JSON.parse(value)
  } catch (e) {
    return value;
  }
}

答案 1 :(得分:1)

它不是有效的json,因此JSON.parse将不起作用。
由于JSON有两个大问题,因此无法使用:
1.这不是数组,因为项目没有被[]
包围。2.键和值不被"

包围

尝试以如下所示的方式修改JSON:
var jsonobject = '{"id":"1","another":"thing"},{"id":"2","another":"item"}';
然后,您可以通过执行以下操作将方括号添加为数组:
var json = '[' + jsonobject + ']';
之后,您可以使用:
JSON.parse(json);

完整代码:

var jsonobject = '{"id":"1","another":"thing"},{"id":"2","another":"item"}';
var json = '[' + jsonobject + ']';
var obj = JSON.parse(json);
// obj now got an js object array.