【问题标题】:flatten and uneven array into an object将不均匀的阵列展平成一个对象
【发布时间】:2015-03-28 21:31:00
【问题描述】:

我有这个数组和对象代表相同的数据:

arrayExample = [
  {name: "max", age: 21},
  {name: "max.David", age: 27},
  {name: "max.Sylvia"},
  {name: "max.David.Jeff"},
  {name: "max.Sylvia.Anna", age: 20},
  {name: "max.David.Buffy"},
  {name: "max.Sylvia.Craig"},
  {name: "max.Sylvia.Robin"}
];
ObjectExample = {
  name: "max",
  age: 21,
  children: [
    {
      name: "Sylvia",
      children: [
        {name: "Craig"},
        {name: "Robin"},
        {name: "Anna", age: 20}
      ]
    },
    {
      name: "David",
      age: 27,
      children: [
        {name: "Jeff"},
        {name: "Buffy"}
      ]
    }
  ]
};

我的目标是扩展 Array 类以具有 2 个函数 flatten 将 objectExample 转换为 arrayExample 和不均匀的相反,我想也许 lodash 在这里会有所帮助,但我仍然没有找到正确的方法在这里做这就是我现在的位置:
首先从 objectExample 展平到 arrayExample objectExample 结构必须是特定的,这意味着父母必须与所有孩子共享一个属性,确保父母和孩子可以拥有其他应该移植到新 arrayExample 中的正确项目的属性,也适用于不均匀函数它应该创建一个对象,所有的父母都与他们的孩子共享相同的属性,其他属性应该分别复制。
为了给出我的用例,我试图在我的应用程序中创建一个 d3js tree layoutangular ui router,这将从路由 JSON 文件生成,因为我在 JSON 文件中创建路由。

更新:

我的具体问题是我需要为 angular-ui-router 配置状态对象创建一个 d3js 树布局,如前所述,我可以将其提取到 json 文件中,ui-router 的结构就像 arrayExample,并且 d3js 树布局所需的结构就像 objectExample,解决此问题的一种方法是手动重写它,它不会花费太多时间,但该解决方案不是我想要的,我需要为此创建一个构建任务通用路由在其配置对象中始终具有 name 属性,可用于查找每个路由或状态的子级,有关更多信息,请查看 ui-router 获取路由配置对象和此 d3 视频以获取 d3 tre 布局:

更正:使用 flatten 函数扩展 Object 类以将对象扁平化为数组,使用 unEven 函数扩展 Array 类以将数组 unEven 扩展为不像我之前写的对象:

我的目标是将 Array 类扩展为具有 2 个功能。

更新 2:

为了更清楚地说明这一点,flatten 和 unEven 都类似于 map 函数,除了 flatten 用于对象而不是数组并返回数组,而 unEven 函数用于数组但返回对象。

【问题讨论】:

  • 您遇到了什么具体问题?
  • 展平的输出是否必须与arrayExample中的确切顺序一致?我问是因为这不是递归算法的自然顺序,因此获得特定顺序会做更多的工作。
  • 这听起来像XY Problem
  • @jfriend00 订单不重要。
  • @GregPrisament 检查更新

标签: javascript arrays d3.js lodash


【解决方案1】:

这是一个产生扁平输出的函数:

工作演示:http://jsfiddle.net/jfriend00/w134L7c6/

var ObjectExample = {
  name: "max",
  age: 35,
  status: "single",
  hometown: "Scottsdale",
  children: [
    {
      name: "Sylvia",
      children: [
          {name: "Craig", age: 16},
        {name: "Robin"},
        {name: "Anna"}
      ]
    },
    {
      name: "David",
      age: 54,
      children: [
        {name: "Jeff"},
        {name: "Buffy"}
      ]
    }
  ]
};

// call this on an object with a name property
// and an optional children property (which would be an array of objects)
function flatten(obj, key, outputArray, rootName) {
    var name, item;
    outputArray = outputArray || [];
    rootName = rootName || "";
    if (rootName) {
        rootName += ".";
    }
    if (obj.hasOwnProperty(key)) {
        name = rootName + obj[key];
        item = {};
        item[key] = name;
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop) && prop !== "children") {
                item[prop] = obj[prop];
            }
        }
        outputArray.push(item)
        if (obj.children) {
            for (var i = 0; i < obj.children.length; i++) {
                flatten(obj.children[i], key, outputArray, name);
            }
        }
    }
    return outputArray;
}

var result = flatten(ObjectExample, "name");

产生这个输出:

[{"name":"max","age":35,"status":"single","hometown":"Scottsdale"},
{"name":"max.Sylvia"},
{"name":"max.Sylvia.Craig","age":16},
{"name":"max.Sylvia.Robin"},
{"name":"max.Sylvia.Anna"},
{"name":"max.David","age":54},
{"name":"max.David.Jeff"},
{"name":"max.David.Buffy"}]

如果你真的想的话,你可以把这个函数改成 Array 原型上的一个方法(我不建议这样做,特别是因为输入甚至不是一个数组)。

当您说“rootName 可以有多个”时,我不明白您的意思。 ObjectExample 是一个对象,因此在顶层不能有多个名称。如果您从 ObjectExample 类似结构的数组开始,那么您可以在顶层数组中的每个对象上循环调用 flatten() 的数组,它会累积结果。

【讨论】:

  • 谢谢,但那不行,检查我的问题我希望如果父母或孩子有更多的属性,这些属性也将被复制,也不应该仅限于名称属性,即应该作为参数提供,而 rootName 我们可以有多个。
  • @YahyaKACEM - 我修改了答案以复制其他属性并传入关键属性字符串以进行名称累积。我不知道你对 rootName 的评论是什么意思。
  • 谢谢,对于这个回复,它尽可能接近我想要的,也谢谢你纠正我的问题,你和@Sukima 是正确的,我会在使用这个答案后重新格式化我的问题并让它按我的意愿工作,但未能正确解释。
  • 您好,如果您有更多 cmets,请检查更新后的问题,请分享,以便我修复可能仍然不正确的问题,谢谢。
  • @yahyakacem - 你已经完全改变了你的问题。这不是堆栈溢出的工作方式。如果您想问第二个问题,请开始一个新问题并将这个问题恢复原状。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多