javascript - 如何通过过滤和修改其他对象来动态创建对象而不改变层次结构?

标签 javascript json object javascript-objects

要创建嵌套对象,我们可以像下面这样做

function assign(obj, keyPath, value) {
   lastKeyIndex = keyPath.length-1;
   for (var i = 0; i < lastKeyIndex; ++ i) {
     key = keyPath[i];
     if (!(key in obj))
       obj[key] = {}
     obj = obj[key];
   }
   obj[keyPath[lastKeyIndex]] = value;
}

Usage:

var settings = {};
assign(settings, ['Modules', 'Video', 'Plugin'], 'JWPlayer');

这将导致这个

"{"Modules":{"Video":{"Plugin":"JWPlayer"}}}"

我想创建嵌套对象,该对象将在同一级别中有多个子对象。

我有以下数据

{
    "children": [{
        "children": [{
            "children": [],
            "label": "A",
            "OrganizationId": 152,
            "id": 152
        }, {
            "children": [{
                "children": [{
                    "children": [],
                    "label": "B",
                    "OrganizationId": 180,
                    "id": 180
                }, {
                    "children": [],
                    "label": "C",
                    "OrganizationId": 181,
                    "id": 181
                }],
                "label": "D",
                "OrganizationId": 166,
                "id": 166
            }],
            "label": "E",
            "OrganizationId": 154,
            "id": 154

        }, {
            "children": [],
            "label": "F",
            "OrganizationId": 157,
            "id": 157
        }, {
            "children": [{
                "children": [{
                    "children": [],
                    "label": "G ",
                    "OrganizationId": 182,
                    "id": 182
                }],
                "label": "H",
                "OrganizationId": 167,
                "id": 167
            }],
            "label": "I",
            "OrganizationId": 155,
            "id": 155

        }]
    }]
}

所以我必须修改上面的对象

即仅选择标签值并将其指定为新对象中的键 通过保持相同的层次结构(预期输出 - 下面)

预期输出:

{
    "A": "",
    "E": {
        "D": {
            "B": "",
            "C": ""
        }
    },
    "F": "",
    "I": {
        "H": {
            "G": ""
        }
    }
}

如果有人可以提供实现此功能的提示或解决方案,那将会有很大帮助。我们将不胜感激!

请在投反对票之前,告诉我这个问题需要编辑什么或者有什么问题。

谢谢!

最佳答案

您可以使用以下代码来处理它:

function getNestedLabels(objectToProcess) {
  var obj = {};

  if (Array.isArray(objectToProcess.children) && objectToProcess.children.length > 0) {
    return objectToProcess.children.reduce(function(o, child) {
      o[child.label] = getNestedLabels(child);
      return o;
    }, obj)
  } else {
    return '';
  }
}
<小时/>

function getNestedLabels(objectToProcess) {
  var obj = {};

  if (Array.isArray(objectToProcess.children) && objectToProcess.children.length > 0) {
    return objectToProcess.children.reduce(function(o, child) {
      o[child.label] = getNestedLabels(child);
      return o;
    }, obj)
  } else {
    return '';
  }
}

var d = {
  "children": [{
    "children": [{
      "children": [],
      "label": "A",
      "OrganizationId": 152,
      "id": 152
    }, {
      "children": [{
        "children": [{
          "children": [],
          "label": "B",
          "OrganizationId": 180,
          "id": 180
        }, {
          "children": [],
          "label": "C",
          "OrganizationId": 181,
          "id": 181
        }],
        "label": "D",
        "OrganizationId": 166,
        "id": 166
      }],
      "label": "E",
      "OrganizationId": 154,
      "id": 154

    }, {
      "children": [],
      "label": "F",
      "OrganizationId": 157,
      "id": 157
    }, {
      "children": [{
        "children": [{
          "children": [],
          "label": "G ",
          "OrganizationId": 182,
          "id": 182
        }],
        "label": "H",
        "OrganizationId": 167,
        "id": 167
      }],
      "label": "I",
      "OrganizationId": 155,
      "id": 155

    }]
  }]
};

console.log(getNestedLabels(d))

关于javascript - 如何通过过滤和修改其他对象来动态创建对象而不改变层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52178247/

相关文章:

javascript - 使用 jQuery 进行多级 JSON

使用@[] 和 initWithObjects 的 Objective-C 数组分配

c# - 将对象类型数据转换为值类型的最佳方法

javascript - session 存储: how to store multiple objects

javascript - 显示此元素,而无需每次都重复代码

javascript - React 中响应的用法

javascript - 如何按两个属性对json数据进行排序

PHP 5.3 从对象 getter 访问数组键

JavaScript - 使用克隆节点和 Json 数据克隆模板

javascript - 使用 Express 进行 Angular 路由