JavaScript:向可能不存在的对象添加嵌套属性

标签 javascript node.js object

假设我有一个 json 对象,我在其中记录我网站的访问者数量,按浏览器/版本分组。

let data = {
    browsers: {
        chrome: {
           43 : 13, 
           44 : 11
        }, 
        firefox: {
           27: 9
        }
    }
}

要增加特定的浏览器,我需要检查是否存在多个键,如果不存在,则创建它们。

let uap = UAParser(request.headers['user-agent']);

if (typeof uap.browser !== 'undefined') {

    if (typeof data.browsers === 'undefined') 
        data.browsers = {}

    if (typeof data.browsers[uap.browser.name] === 'undefined')
        data.browsers[uap.browser.name] = {}

    if (typeof data.browsers[uap.browser.name][uap.browser.version] === 'undefined')
        data.browsers[uap.browser.name][uap.browser.version] = 0

    data.browsers[uap.browser.name][uap.browser.version] += 1;
}

我的数据结构越深,事情就越疯狂。

感觉在 javascript 中必须有一种更简洁的方法来执行此操作。 总有更简洁的方法。有人可以在这里启发我吗?

最佳答案

这段较短的代码应该可以解决问题:

if (uap.browser) { // typeof is pretty much redundant for object properties.
    const name = uap.browsers.name; // Variables for readability.
    const version = uap.browser.version;

    // Default value if the property does not exist.
    const browsers = data.browsers = data.browsers || {}; 
    const browser = browsers[name] = browsers[name] || {};
    browser[version] = browser[version] || 0;

    // Finally, increment the value.
    browser[version]++;
}

请注意,您在本应使用 = 的地方使用了 ===(在 === {} 中)。

让我们解释一下这一行:

const browsers = data.browsers = data.browsers || {};

最后一部分:data.browsers = data.browsers || {}data.browsers 设置为自身(如果存在)。如果还没有,它将被设置为一个新的空对象。
然后,将整个值分配给 browsers,以便于访问。

现在,较短的代码不应该是首要任务,但在这种情况下,您可以使代码更具可读性。

关于JavaScript:向可能不存在的对象添加嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45917609/

相关文章:

javascript - 如何获取 JSON 对象的模式并输出到包含类型的字符串

javascript - 我们如何在不使用 Javascript 的情况下向 python Bottle 服务器发送 GET 请求?

javascript - 检测悬空 promise 的静态/动态方法

Javascript 解析嵌套的 JSON 对象

javascript - 将 object.keys 复制到新对象

javascript - 如何在 Angular 智能表上设置默认排序顺序?

用于验证用户输入正确信息的 Javascript 代码

node.js - 无法在 Ubuntu 中使用 Express.js

javascript - JSON.parse 无法使用 Twitter 流 api 中的 json

Java 用循环创建对象?