将重复的JSON名称转换为对象?

Sea*_*n T 1 javascript jquery json

我有以下字符串......

{
    "Qualifications[0].DegreeType": "Degree Type 1",
    "Qualifications[0].Classification": "Clasification 1",
    "Qualifications[0].CourseTitle": "Course Title 1",
    "Qualifications[0].YearOfAward": "2018",
    "Qualifications[0].AwardingInstitution": "Awarding institution 1",
    "Qualifications[1].DegreeType": "Degree Type 2",
    "Qualifications[1].Classification": "Classification 2",
    "Qualifications[1].CourseTitle": "Course Title 2",
    "Qualifications[1].YearOfAward": "2019",
    "Qualifications[1].AwardingInstitution": "Awarding Institution 2",
    ... and so on...
 }
Run Code Online (Sandbox Code Playgroud)

有没有人知道将其转换为javascript对象的简单方法,以便我可以有效地去...

$(Qualifications).each(i, v){
    //do stuff on whatever property of Qualifications[i]
}
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一方法是使用字符串操作和类似下面的东西,但是它需要为每个属性进行大量的自定义代码检查映射,而且我需要更通用和简单的东西....

    let i = 0;
    while (Qualifications[" + i +"].whateverProperty..) {
        //add to object array
        i++;
    }
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 5

您可以通过遍历给定对象来拆分键并减少路径.

如果不存在对象,请使用名称或数组创建新属性.稍后分配值.

function setValue(object, path, value) {
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
        last = way.pop();

    way.reduce(function (o, k, i, kk) {
        return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
    }, object)[last] = value;
}

var object = {
        "Qualifications[0].DegreeType": "Degree Type 1",
        "Qualifications[0].Classification": "Clasification 1",
        "Qualifications[0].CourseTitle": "Course Title 1",
        "Qualifications[0].YearOfAward": "2018",
        "Qualifications[0].AwardingInstitution": "Awarding institution 1",
        "Qualifications[1].DegreeType": "Degree Type 2",
        "Qualifications[1].Classification": "Classification 2",
        "Qualifications[1].CourseTitle": "Course Title 2",
        "Qualifications[1].YearOfAward": "2019",
        "Qualifications[1].AwardingInstitution": "Awarding Institution 2"
    },
    result = {};

Object.entries(object).forEach(([k, v]) => setValue(result, k, v));

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)