【问题标题】:How to flatten a JavaScript object into a daisy chain like form?如何将 JavaScript 对象扁平化为菊花链形式?
【发布时间】:2017-07-29 15:52:01
【问题描述】:

我想把这样的对象弄平...

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;
}

我很快就开始不必要地重复代码,以便菊花链内部对象和数组。这绝对是需要递归的东西。有什么想法吗?

编辑:这个问题类似于otherquestions,但不是重复的。这道题需要特定的符号,同时需要嵌套对象和数组。

编辑:我还在another question 中问过相反的问题。

【问题讨论】:

标签: javascript recursion typescript ecmascript-6 flatten


【解决方案1】:

您可以像这样创建递归函数,将以前的键存储在一个字符串中很重要。

var obj1 = {
  firstName: 'John',
  lastName: 'Green',
  car: {
    make: 'Honda',
    model: 'Civic',
    revisions: [
      { miles: 10150, code: 'REV01', changes: 0},
      { 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' }
  ]
};

function flatten(data, c) {
  var result = {}
  for(var i in data) {
    if(typeof data[i] == 'object') Object.assign(result, flatten(data[i], c + '.' + i))
    else result[(c + '.' + i).replace(/^\./, "")] = data[i]
  }
  return result
}

console.log(JSON.stringify(flatten(obj1, ''), 0, 4))

【讨论】:

    【解决方案2】:

    试试这个:

    function flatten(obj)
    {
      var result = {};
      (function f(e, p) {
        switch (typeof e) {
          case "object":
            p = p ? p + "." : "";
            for (var i in e)
              f(e[i], p + i);
            break;
          default:
            result[p] = e;
            break;
        }
      })(obj);
      return result;
    }
    
    var obj1 = {
      firstName: 'John',
      lastName: 'Green',
      car: {
        make: 'Honda',
        model: 'Civic',
        revisions: [{
          miles: 10150,
          code: 'REV01',
        }, {
          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'
      }]
    };
    
    console.log(flatten(obj1));

    【讨论】:

      【解决方案3】:

      这是我的代码(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;
      };
      
      

      【讨论】:

        猜你喜欢
        • 2022-10-05
        • 1970-01-01
        • 2021-12-01
        • 2017-07-30
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多