访问双嵌套对象和返回键值对

时间:2017-07-31 01:49:44

标签: javascript object nested extract

我有一个具有以下结构的对象:(查看名为dataValues的数组)。

{
pager: {
    page: 1,
    pageCount: 1,
    total: 0,
    pageSize: 50
},
events: [{
        storedBy: "admin",
        dueDate: "2017-07-12T19:11:19.801",
        dataValues: [{
                dataElement: "F3ogKBuviRA",
                value: "[-10.33505,8.46094]",
            },
            {
                dataElement: "oZg33kd9taw",
                value: "Female",
            }
        ],
        notes: []
    },
    {
        storedBy: "admin",
        dueDate: "2017-07-12T19:11:11.449",
        dataValues: [{
                dataElement: "pzsJKs59JsY",
                value: "G-3707",
            },
            {
                dataElement: "AmO6YwrO46f",
                value: "Male",
            },
        ],
    }
  ]
}

我需要访问每个嵌套数组dataValues并返回一对key:values的对象,其中键是 dataElement 的值,值是的值值

dataElement: value => oZg33kd9taw: "Female"。最后,我想像这样构建一个GeoJSON:

{
type: "FeatureCollection",
"features": [{
    "type": "Feature",
    "geometry": {
        type: "Point",
        "coordinates": [-10.33505, 8.46094]
    },
    "properties": {
        //inject extracted values here!!
        oZg33kd9taw: "Female",
        pzsJKs59JsY: "G-3707"
    }
}]
}

我试图实现一个深入到对象的递归函数,直到它再也找不到嵌套对象,然后返回值:

function eachRecursive(obj){
  for (var k in obj){
  if (typeof obj[k] == "object" && obj[k] !== null)
    eachRecursive(obj[k]);
    if (obj.dataValues != undefined) {
        obj.dataValues.forEach(d => {console.log(d)})
      console.log(obj.dataValues);
    }
  }
}

这不按预期工作,因为它返回值n次(其中n是对象内现有dataValues数组的数量)。任何使用vanilla JS或lodash,ramda或类似库的建议或解决方案都非常感谢。如果我可以将值对提取到数组数组或单独的对象中,那将会有很多帮助。谢谢!

这是一个小提琴:https://jsfiddle.net/zrLnva0u/6/

2 个答案:

答案 0 :(得分:0)

@Bergi说的话......

var pairs = {};

data.events.forEach(event => {
  event.dataValues.forEach(el => {
    pairs[el.dataElement] = el.value;
  });
});

console.log(pairs)

https://jsfiddle.net/0gxrudy0/

答案 1 :(得分:0)

经过大量的来回,这是解决方案,万一有人想知道:

    data.events.forEach((event) => {
        cases.push(event.dataValues);
    });

    for (var i = 0; i < cases.length; i++) {
        var dataValues = cases[i];
        var object = {};
        for (var j = 0; j < dataValues.length; j++) {
            var d = dataValues[j];
            object[d.dataElement] = d.value;
        }
        test.push(object);
    }

这将返回一个数组数组,其中每个数组都包含一个dataElement: value对的对象。