如何将这个嵌套对象转换为扁平化对象?

31

抱歉,我不知道如何表达问题标题。请尽可能帮忙编辑。

我有一个像这样的对象:

{
    a: 'jack',
    b: {
        c: 'sparrow',
        d: {
           e: 'hahaha'
        }
    }
}
我想让它看起来像:
{
    'a': 'jack',
    'b.c': 'sparrow',
    'b.d.e': 'hahaha'
}

// so that I can use it this way:
a['b.d.e']

jQuery也可以。我知道对于嵌套对象,我可以使用a.b.d.e来获取hahaha,但今天我必须像这样使用它a['b.d.e'] -_-!!!如何实现?提前致谢 :)

16个回答

0

var flattenObject = function(ob) {
  var toReturn = {};

  for (var i in ob) {
    if (!ob.hasOwnProperty(i)) continue;

    if ((typeof ob[i]) == 'object' && ob[i] !== null) {
      var flatObject = flattenObject(ob[i]);
      for (var x in flatObject) {
        if (!flatObject.hasOwnProperty(x)) continue;

        toReturn[i + '.' + x] = flatObject[x];
      }
    } else {
      toReturn[i] = ob[i];
    }
  }
  console.log(toReturn)
  return toReturn;
};

var ob = {
  'a': {
    'b': {
      'b2': 2
    },
    'c': {
      'c2': 2,
      'c3': 3
    }
  }
};
flattenObject(ob);


你能否编辑你的答案,以便解释你的解决方案?谢谢。 - Werner Henze

0

function flatObject(object, currentKey) {
  return Object.entries(object).reduce((acc, [key, value]) => {
    const tempKey = currentKey ? `${currentKey}.${key}` : key;

    return value instanceof Object ?
      { ...acc, ...flatObject(value, tempKey) } :
      { ...acc, [tempKey]: value };
  }, {});
}

const test = {
    a: 'jack',
    b: {
        c: 'sparrow',
        d: {
            e: 'hahaha'
        }
    }
};

console.log(flatObject(test))


0
const flatten = function(obj) {
  const result = {};

  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      const childObj = flatten(obj[key]);
    
      for (let childObjKey in childObj) {
        result[`${key}.${childObjKey}`] = childObj[childObjKey];
      }
    } else {
      result[key] = obj[key];
    }
  }
  return result
}

var test = {
    a: 'jack',
    b: {
        c: 'sparrow',
        d: {
            e: 'hahaha'
        }
    }
};

console.log(flatten(test));

0

如果你在这里想要转换像这样的嵌套对象

{
  a:2,
  b: {
    c:3
  }
}

到这里

  {
  a:2,
  c:3
}

如果想要将嵌套对象展平,可以尝试使用一行代码的 Object.assign 方法。

Object.assign({}, ...function _flatten(o) { return [].concat(...Object.keys(o).map(k => typeof o[k] === 'object' ? _flatten(o[k]) : ({[k]: o[k]})))}(yourObject))

参考此帖子

https://dev59.com/SlwY5IYBdhLWcg3wFkaj#33037683


0
我认为这是以上所有解决方案中最简单的解决方案,我使用了递归函数来跟踪键,并最终将其与新对象一起返回。
let obj = {
    a: 'jack',
    b: {
        c: 'sparrow',
        d: {
           e: 'hahaha'
        }
    }
}

const flatObj = (obj) => {
    let obj1 = {}
    function recur(obj, st){
      for(let ob in obj){
        if(typeof obj[ob] === 'object' && obj[ob] !== null){
          recur(obj[ob], st+ob)
        }else{
          obj1[(st+ob).split('').join('.')] = obj[ob]
        }
      }
   }

  recur(obj, "")
  
  return obj1
}

let res = flatObj(obj)

console.log(res)


-4
尝试一下:

const result = [].concat.apply([], parentArray.map((item: any) => item.any)


2
这不是JavaScript,也不是关于普通对象的问题,甚至不适用于数组。没有上下文说明这段代码应该如何工作。总的来说,“试试这个”这样的答案并不有用。请添加一些解释。仅有代码的答案对未来的读者来说不太有用,也无法解释OP的错误或如何解决问题。 - Sebastian Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接