将数组值属性展平为单个元素值

时间:2015-10-03 17:57:19

标签: javascript arrays node.js object underscore.js

在我的Node.js应用程序中,我有一些难看的数据:

{"rn":["801"],"destSt":["30089"],"destNm":["95th/Dan Ryan"],"trDr":["5"],"nextStaId":["41430"],"nextStpId":["30276"],"nextStaNm":["87th"],"prdt":["20151003 12:36:48"],"arrT":["20151003 12:38:48"],"isApp":["0"],"isDly":["0"],"flags":[""],"lat":["41.75042"],"lon":["-87.62518"],"heading":["179"]}

正如您所看到的,每个对象属性都莫名其妙地包含一个数组,其值应该直接是该属性的值。

我希望将所有内容都移到一个级别,以便它看起来像:

{"rn":"801","destSt":"30089","destNm":"95th/Dan Ryan"}

(等)

在任何情况下,任何这些数组都不会包含任何多个值。

最好的方法是什么?我尝试过下划线,但没有成功。

而且我不确定如何去搜索谷歌。 :)

5 个答案:

答案 0 :(得分:0)

一种方法是使用JSON reviver函数来修改值。这样做的好处是它也可以遍历嵌套对象。

JSON.parse(data, function(key, value) {
  if (Array.isArray(value)) {
    value = value[0];
  }
  return value;
});

DEMO:http://jsbin.com/hexogaqeja/edit?js,console

答案 1 :(得分:0)

试试这个:

var obj = {"rn":["801"],"destSt":["30089"],"destNm":["95th/Dan Ryan"],"trDr":["5"],"nextStaId":["41430"],"nextStpId":["30276"],"nextStaNm":["87th"],"prdt":["20151003 12:36:48"],"arrT":["20151003 12:38:48"],"isApp":["0"],"isDly":["0"],"flags":[""],"lat":["41.75042"],"lon":["-87.62518"],"heading":["179"]},

newObj = Object.keys(obj).reduce(function(result, item){
  result[item] = obj[item][0];  

  return result;
}, {});

答案 2 :(得分:0)

迭代键并更改其值:

Object.keys(obj).forEach(key => obj[key] = obj[key][0])

这会修改对象。如果您更愿意创建另一个对象

function unarrayize(obj) {
  var result = {};
  for (var k in obj) result[k] = obj[k][0];
  return result;
}

如果你想使用下划线:

_.mapObject(obj, function(val) { return val[0]; })

答案 3 :(得分:0)

我可能误导了数据的复杂性(我假设我可以只针对每个数据进行挑选并挑选出来。)

真的,我的数据是包含一组包含属性的列车的路线集。我发布的数据只是火车一条路线的数据。

所以我这样做了:

        _.each(routes,function(route, rt_index, list) {
            _.each(route, function (train, train_index,list){
                _.each(train, function (property, property_index,list){
                    routes[rt_index][train_index][property_index] = property[0];
                });
            });
        });

虽然我确信有更清洁的方式。

答案 4 :(得分:-1)

以下是使用查询字符串核心模块执行此操作的方法:

var qs = require('querystring');

var obj = {"rn":["801"],"destSt":["30089"],"destNm":["95th/Dan Ryan"],"trDr":["5"],"nextStaId":["41430"],"nextStpId":["30276"],"nextStaNm":["87th"],"prdt":["20151003 12:36:48"],"arrT":["20151003 12:38:48"],"isApp":["0"],"isDly":["0"],"flags":[""],"lat":["41.75042"],"lon":["-87.62518"],"heading":["179"]};

var newObj = qs.parse(qs.stringify(obj));

可能不是最好的方式,但它可以满足您的需求。