【问题标题】:Finding Nested object查找嵌套对象
【发布时间】:2017-11-21 20:15:21
【问题描述】:

考虑一个对象

var obj = {
    val: 123,
    vals: {
        val: 45,
        vals: {
            val: 90
        }
    },
    name: 'abc',
    names: {
        name: 'xyz'
    }
};

我需要这样的东西:

var obj = {
    val: 123,
    vals_val: 45,
    vals_vals_val: 90,
    name: 'abc',
    names_name: 'xyz'
};

谁能告诉我如何进入嵌套对象并访问属性及其值?我尝试了 for..in 循环,但没有任何想法。

【问题讨论】:

标签: javascript


【解决方案1】:

您可以使用reduce() 方法并返回新对象作为结果。

var obj = {"val":123,"vals":{"val":45,"vals":{"val":90}},"name":"abc","names":{"name":"xyz"}}

function keys(data, prev = '') {
  return Object.keys(data).reduce(function(r, e) {
    var key = prev + (prev.length ? '_' + e : e)
    if (typeof data[e] == 'object') Object.assign(r, keys(data[e], key))
    else r[key] = data[e]
    return r;
  }, {})
}

var r = keys(obj)
console.log(r)

【讨论】:

  • 你能告诉我你给出的代码的逻辑或概述吗?我不期待逐行解释,只是一些概述或方法。谢谢
  • 数组通过typeof == "object",它们的元素会变成键。如果任何值是数组,这将爆炸。 typeof data[e] === "object" && Object.getPrototypeOf(data[e]) === Object.prototype 是更好的(但仍然不是防弹的)检查
  • 如果任何值是Date 对象,此解决方案将完全省略该属性。
【解决方案2】:

你可以这样做。我来举个例子:

var John = {
  age: 23,
  address: {
    Paris: "La rue",
    London: "Tower street"
  },
  surname: "Smith"
};

document.write("Address 1: " + John.address.Paris);
document.write("Surname: " + John.surname);
document.write("Age: " + John.age);

您可以使用“.”访问每个值

【讨论】:

    【解决方案3】:

    你可以采取递归的方法,删除与新密钥不同的项目。

    function update(object) {
        function iter(o, p) {
            Object.keys(o).forEach(function (k) {
                var t;
                if (o[k] && typeof o[k] === 'object') {
                    iter(o[k], p.concat(k));
                } else {
                    t = p.concat(k).join('_');
                    object[t] = o[k];
                }
                if (k !== t) {
                    delete o[k];
                }
            });
        }
        iter(object, []);
    }
    
    var object = { val: 123, vals: { val: 45, vals: { val: 90 } }, name: 'abc', names: { name: 'xyz' } };
    
    update(object);
    
    console.log(object);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多