Javascript:从另一个对象在javascript中创建一个深度嵌套的对象

标签 javascript arrays nested lodash javascript-objects

Javascript:如何从对象数组中动态创建深度嵌套的对象? 我可以实现一级分离,但代码已经变得相当复杂,我无法弄清楚如何在第二级实现这一点。

实际:

[{
    brandId: 1,
    spec_desc: "engines",
    av: 3000
    tv: 1000,
    brandName: "bmw",
    id: 1,
    group: "cars",
    cost: 20000.00,
    currency: "USD",
    desc: "manufacturing costs"
  },
  {
    brandId: 1,
    spec_desc: "brakes",
    av: 1000,
    tv: 2000,
    brandName: "bmw",
    id: 1,
    ....
  },
  {
    brandId: 2,
    spec_desc: "engines",
    av: 1800,
    tv: 2500,
    brandName: "audi",
    id: 2
    ....
  }
]

预期:

[{
    group: "cars",
    id: 1,
    brands: [{
        brandId: 1,
        brandName: "BMW",
        specs: {
          power: [{
              spec_desc: "engines",
              av: 3000,
              tv: 1000
            },
            {
              spec_desc: "brakes",
              av: 1000,
              tv: 2000
            }
          ],
          cost: {
            desc: "manufacturing costs",
            value: 20000.00,
            currency: "USD"
          }
        }
      },
      {
        brandId: 2,
        brandName: "audi",
        specs: {
          power: [
            ...
          ],
        }
      }
    ]
  },
  group: "bikes",
  id: 2,
  brands: [
    ....
  ]
]

这是我尝试过的方法,但只能在 brandName 即一级之前获得分组。

function genrows(groups, groupKey) {
  return _.toPairs(groups).map(([key, units]) => ({
    [groupKey]: key,
    units
  }))
}

function gengroups(arr, iteratee, key) {
  const grouped = _.groupBy(arr, iteratee)
  return genrows(grouped, key)
}

function grouparray(units, props) {
  let result = [{
    units
  }]
  props.forEach((prop, i) => {
    const key = prop
    const iteratee = prop.iteratee || prop
    result = _.flatten(
      result.map(row => {
        return gengroups(row.units, iteratee, key).map(group =>
          // {...row, ...{ [key]: group[key], units: group.units }}
          ({ ...row,
            [key]: group[key],
            units: group.units
          }),
        )
      }),
    )
  })
  return _.flatten(result)
}

const groups = ['brandName', 'id'] //group by key names
// it fetches out these group tags to generate keys, 
const desired = grouparray(actual, groups);

谁能帮我弄清楚如何动态地实现这一点?如果您已经读到这里,非常感谢您抽出时间阅读,即使您无能为力。

PS:让我知道进一步说明,我的结果对象还使用了 lodash 函数。

最佳答案

您可以采用经典方法存储最后一组,其中找到 id 并将品牌与该对象分组。

var data = [{ brandId: 1, spec_desc: "engines", av: 3000, tv: 1000, brandName: "bmw", id: 1, group: "cars", cost: 20000.00, currency: "USD", desc: "manufacturing costs" }, { brandId: 1, spec_desc: "brakes", av: 1000, tv: 2000, brandName: "bmw" }, { brandId: 2, spec_desc: "engines", av: 1800, tv: 2500, brandName: "audi" }],
    lastGroup,
    result = data.reduce((r, { brandId, spec_desc, av, tv, brandName, id, group, cost: value, currency, desc }) => {
        if (id !== undefined) r.push(lastGroup = { group, id, brands: [] });
        var brand = lastGroup.brands.find(q => q.brandId === brandId);
        if (!brand) lastGroup.brands.push(brand = { brandId, brandName, specs: { power: [], cost: { desc, value, currency } } });
        brand.specs.power.push({ spec_desc, av, tv });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于Javascript:从另一个对象在javascript中创建一个深度嵌套的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57112424/

相关文章:

javascript - 在推送对象时,我得到的所有内容都是 NULL angular2+typescript

javascript - 为什么这段 JavaScript 代码经过 Node.js 优化后运行速度变慢了

javascript - Jquery,检查多级数组中是否已经有这个

java - 通用内部类构造函数接受不同类型的参数设置什么?

linux - 如何将多个较小文件中的文本插入主文件的不同位置?

javascript - 在 JavaScript 中将拉丁字母转换为等效的十进制值

javascript - 清除文本框值 onclick 并显示 onblur

javascript - 获取用户输入,而不是将输入硬编码到数组中

javascript - IF 语句、数组和函数 - Javascript

c# - 如何根据外部 GridView 选择填充内部 GridView (ASP.NET/C#)