我有一个类似的字符串:
"{id:1,another:thing},{id:2,another:item}"
如何在JS中将其转换为对象数组[{...},{...}]
?
编辑
答案 0 :(得分:3)
使用这种格式,您几乎可以转换为对象。它不是有效的JSON,但如果我们尝试解决问题,它就很容易:
"{id:1,another:thing},{id:2,another:item}"
中可以得到一个数组,其中每个项目都是“对象”,并且仅包含键值将是的->因此,每个项目都是“ {id:1,另一个:事}” {id:1,another:thing}
-> "id:1"
和"another:thing"
的字符串"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.