js 将对象的属性全部提升到第一层

发布于 2022-09-06 05:06:34 字数 462 浏览 24 评论 0

数据结构如下

var a = {
    b: {
        c: {
            d: '平底锅'
        }
    },
    e: {
        f: {
            g: 'M416'
        },
        h: {
            i: '98K'
        }
    }
}

请编写算法:
要求能访问 a.b_c_d 可以得到 平底锅
要求能访问 a.e_f_g 可以得到 M416
要求能访问 a.e_f_i 可以得到 98K

最终结果数据结构如下

        b_c_d: '平底锅',
        e_f_g: 'M416',
        e_f_h: '98K'
   }

我觉得应该是使用递归,但是不知道怎么修改到a的key,请各位指教

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

客…行舟 2022-09-13 05:06:34

我发现大家都只判断了typeof(obj) === 'object' 但是还要判断是否是null
我原先一直在纠结没有指针怎么修改原变量,现在找到了一个简单的办法

var a = {
    b: {
        c: {
            d: '平底锅'
        }
    },
    e: {
        f: {
            g: 'M416'
        },
        h: {
            i: '98K'
        }
    }
}

function func(r, obj, father) {
    for (key in obj) {
        if (typeof (obj[key]) === 'object' && obj[key] != null) {
            if (father != "") {
                r = func(r, obj[key], father + "_" + key)    
            } else {
                r = func(r, obj[key], father + key)
            }
            
        } else {
            r[father + "_" + key] = obj[key]
        }
    }
    return r
}
var res = {}
console.log(func(res, a, ""))
十级心震 2022-09-13 05:06:34

可以去看一下二叉树的递归,相信应该有帮助

悲喜皆因你 2022-09-13 05:06:34

恩,你一定吃鸡吃多了。。。
这是我封装的一个更改属性名称的方法。思想就是判断其属性是否是对象,如果是,那么递归调用并记录路径path。
如果不是就把它返回到一个新的对象中。

var obj2 = {}
function changeObj(obj,path) {
    if (typeof obj === 'object') {
        for (x in obj) {
            changeObj(obj[x],path+x)
        }
    }
    else {
        obj2[path] = obj
    }
}

当然,这个算法有一定的局限性。不过在你这个例子中是可以适用的。你可以试试

寒冷纷飞旳雪 2022-09-13 05:06:34

递归拼接key就可以了呀,这是es6语法版

/**
 * 
 * @param obj
 */
function upsetObj(obj) {
  Object.entries(obj).forEach(([k, v]) => {
      Object.prototype.toString.call(v) === '[object Object]' && reacquire(k, v);
  })

  function reacquire(initial, tar) {//闭包函数为了直接使用目标对象(即需要修改的对象)
    Object.entries(tar).forEach(([k, v]) => {
      let key = initial + '_' + k;
      if (Object.prototype.toString.call(v) === '[object Object]') {
        reacquire(key, v);
      } else {
        obj[key] = v;
      }
    })
  }
}
海拔太高太耀眼 2022-09-13 05:06:34
var a = {
  b: {
    c: {
      d: '平底锅'
    }
  },
  e: {
    f: {
      g: 'M416'
    },
    h: {
      i: '98K'
    }
  }
}

function flat(obj) {
  var rtn = {};
  (function ff(inObj, tmp) {
    for(key in inObj){
      var newTmp = tmp + '_' + key
      if (typeof inObj[key] === 'string') {
        rtn[newTmp.slice(1, newTmp.length)] = inObj[key]
      } else {
        ff(inObj[key], newTmp)
      }
    }
  })(obj, '')
  return rtn
}

console.log(flat(a))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文