javascript - 如何将 JavaScript 对象扁平化为类似菊花链的形式?

标签 javascript recursion typescript ecmascript-6 flatten

我想压平这样的物体......

var obj1 = {
  firstName: 'John',
  lastName: 'Green',
  car: {
    make: 'Honda',
    model: 'Civic',
    revisions: [
      { miles: 10150, code: 'REV01', changes: },
      { miles: 20021, code: 'REV02', changes: [
        { type: 'asthetic', desc: 'Left tire cap' },
        { type: 'mechanic', desc: 'Engine pressure regulator' }
      ] }
    ]
  },
  visits: [
    { date: '2015-01-01', dealer: 'DEAL-001' },
    { date: '2015-03-01', dealer: 'DEAL-002' }
  ]
};

...形成如下菊花链形式:

{
    "firstName": "John",
    "lastName": "Green",
    "car.make": "Honda",
    "car.model": "Civic",
    "car.revisions.0.miles": 10150,
    "car.revisions.0.code": "REV01",
    "car.revisions.0.changes": ,
    "car.revisions.1.miles": 20021,
    "car.revisions.1.code": "REV02",
    "car.revisions.1.changes.0.type": "asthetic",
    "car.revisions.1.changes.0.desc": "Left tire cap",
    "car.revisions.1.changes.1.type": "mechanic",
    "car.revisions.1.changes.1.desc": "Engine pressure regulator",
    "visits.0.date": "2015-01-01",
    "visits.0.dealer": "DEAL-001",
    "visits.1.date": "2015-03-01",
    "visits.1.dealer": "DEAL-002"
}

这是我的(失败的)尝试:

function flatten(obj) {
    var flattenObject = {};

    // iterate given object
    for (let x in obj) {
        if (typeof obj[x] == 'string') {
            flattenObject[x] = obj[x];
        }

        if (typeof obj[x] == 'object') {
            for (let y in obj[x]) {
                flattenObject[x + '.' + y] = obj[x][y];
            }
        }
    }

    return flattenObject;
}

我很快开始不必要地重复代码,以便以菊花链方式连接内部对象和数组。这肯定是需要递归的事情。有什么想法吗?

编辑:这个问题类似于 other questions但不是重复的。本题需要特定的表示法,同时需要嵌套对象和数组。

编辑:我也在 another question 中问了相反的问题,未扁平化。 .

最佳答案

这是我的代码(typesciprt)

export const flatten = (data: object, prefix: string = '') => {
  const result: { [key: string]: string | number | null } = {};

  Object.entries(data).forEach(([key, value]) => {
    if (typeof value === 'object') {
      Object.assign(result, flatten(value, `${prefix}${key}.`));
    } else {
      result[`${prefix}${key}`] = value;
    }
  });

  return result;
};

JavaScript版本

export const flatten = (data, prefix = '') => {
  const result = {};

  Object.entries(data).forEach(([key, value]) => {
    if (typeof value === 'object') {
      Object.assign(result, flatten(value, `${prefix}${key}.`));
    } else {
      result[`${prefix}${key}`] = value;
    }
  });

  return result;
};

关于javascript - 如何将 JavaScript 对象扁平化为类似菊花链的形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42682179/

相关文章:

javascript - 计算 HTML 列表中显示元素的数量

java - 二维递归

java - 如何翻转这把尺子?

typescript - 使用枚举值作为通用参数不适用于具有多个值的枚举

typescript :如何合并这个交叉点的表示(在工具提示中)?

typescript - 如何在Electron项目中添加自己的 typescript 类

javascript - 日期差异大于预期

javascript - 如何删除跨度中的连字符? (jQuery)

javascript - React JS:检查对象上的每个项目是否正确,然后添加图标

algorithm - 如何在递归调用中获取路径