【问题标题】:Access double nested object and return key value pairs访问双重嵌套对象并返回键值对
【发布时间】:2017-07-31 01:49:44
【问题描述】:

我有一个具有以下结构的对象:(查看名为 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 并返回一个由键对组成的对象:值,其中键是 dataElement 的值,值是 value:

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/

【问题讨论】:

  • 为什么要使用递归?您的数据中没有任意嵌套,它只有两个级别。所以使用两个嵌套循环,一个用于events,一个用于dataValues
  • GeoJSON 中的 Male 发生了什么?为什么F3ogKBuviRA会变成坐标?

标签: javascript object nested extract


【解决方案1】:

@Bergi 说了什么...

var pairs = {};

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

console.log(pairs)

https://jsfiddle.net/0gxrudy0/

【讨论】:

  • 感谢@Tom 的回答。不过有一个小问题,因为并非所有的 dataValues 数组都具有相同的长度(我意识到我忘了提到这一点),我可能需要一个包含对象的数组数组。查看 fiddle 上的变量 demo 以获取示例 jsfiddle.net/0gxrudy0/2
【解决方案2】:

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

    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 对的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多