下划线将数组转换为对象键

时间:2015-06-10 00:14:01

标签: javascript underscore.js

我正在尝试将此数组转换为对象。使用下划线,我想转换这个数组:

[
{
    "id": "parentA",
    "children": [
        {
            "name": "name1"
        },
        {
            "name": "name2"
        },
        {
            "name": "name3"
        }
    ]
},
{
    "id": "parentB",
    "children": [
        {
            "name": "name4"
        },
        {
            "name": "name5"
        },
        {
            "name": "name6"
        }
    ]
}]

进入一个看起来像这样的对象:

{
    "name1": "parentA",
    "name2": "parentA",
    "name3": "parentA",
    "name4": "parentB",
    "name5": "parentB",
    "name6": "parentB"
}

我真的只是寻找最干净/最简单的方式。

4 个答案:

答案 0 :(得分:0)

使用两个reduce

,这是一个相当简短的方法

var data = [
{
    "id": "parentA",
    "children": [
        {
            "name": "name1"
        },
        {
            "name": "name2"
        },
        {
            "name": "name3"
        }
    ]
},
{
    "id": "parentB",
    "children": [
        {
            "name": "name4"
        },
        {
            "name": "name5"
        },
        {
            "name": "name6"
        }
    ]
}];

var out = _.reduce(data, function(result, parent) {
  _.reduce(parent.children, function(r, child) {
    r[child.name] = parent.id;
    return r;
  }, result);
  return result;
}, {});

document.write(JSON.stringify(out));
<script src="http://underscorejs.org/underscore-min.js"></script>

答案 1 :(得分:0)

var a = [{
  "id": "parentA",
  "children": [{
    "name": "name1"
  }, {
    "name": "name2"
  }, {
    "name": "name3"
  }]
}, {
  "id": "parentB",
  "children": [{
    "name": "name4"
  }, {
    "name": "name5"
  }, {
    "name": "name6"
  }]
}];
var new_obj = {};
var len = a.length;

for (j = 0; j < len; j++) {
  var c = $.extend({}, a[j]);

  var children_length = (c.children).length;


  for (i = 0; i < children_length; i++) {
    var temp = ((a[j].children)[i]).name;
    new_obj[temp] = c.id;
  }
}
document.write(JSON.stringify(new_obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 2 :(得分:0)

如果您支持没有原生reduce和forEach数组方法的浏览器,您只需要使用下划线,但您可以这样做。

var result = _.reduce(array, function(memo, entry) {
    _.each(entry.children, function(child) {
        memo[child.name] = entry.id;
    });
    return memo;
}, {});

答案 3 :(得分:0)

function expand(list){
  return _.reduce(list,function(a,b) {
      _.each(b.children, function(c) {
      a[c.name] = b.id;
    });
    return a;
  },{});
}

检查样本的输出here