简体   繁体   English

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

[英]Underscore Convert array to object keys

I am trying to convert this array to an object. 我试图将此数组转换为对象。 Using underscore, I want to convert this array : 使用下划线,我要转换此数组:

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

into an object that looks like this: 变成一个看起来像这样的对象:

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

I'm really just looking for the cleanest/simplest way possible. 我真的只是在寻找最干净/最简单的方法。

Here's a fairly short way to do it with two reduce : 这是使用两个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> 

 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> 

You'll only need to use underscore if you're supporting browsers without native reduce and forEach array methods, but you can do it like this. 如果要支持没有本机reduce和forEach数组方法的浏览器,则只需要使用下划线,但是您可以这样做。

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

Check the output for your sample here 此处检查样本的输出

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM