Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON:如何处理从键派生的属性?_Javascript_Json_Attributes_Derived - Fatal编程技术网

Javascript JSON:如何处理从键派生的属性?

Javascript JSON:如何处理从键派生的属性?,javascript,json,attributes,derived,Javascript,Json,Attributes,Derived,在我的应用程序中有一个类似这样的JSON对象: var pages = { home: { title: "Home", description: "The home page", file: "home.html", url: "/home" }, blog: { title: "Blog", description: "Our blog", file: "b

在我的应用程序中有一个类似这样的JSON对象:

var pages = {
    home: {
        title: "Home",
        description: "The home page",
        file: "home.html",
        url: "/home"
    },
    blog: {
        title: "Blog",
        description: "Our blog",
        file: "blog.html",
        url: "/blog"
    }
};
属性
文件
url
始终可以从相应的键派生,因此我目前在代码中定义了上述对象:

var pages = {
    home: {
        title: "Home",
        description: "The home page"
    },
    blog: {
        title: "Blog",
        description: "Our blog"
    }
};

$.each(pages, function(key, value) {
    value.file = key + ".html";
    value.url = "/" + key;
}
但是,由于
file
url
是派生属性,因此将它们添加到对象似乎是多余的。但是,由于我为每个页面传递值,而不是键,因此我还必须将其添加到对象中,这也是多余的。像这样:

var pages = {
    home: {
        title: "Home",
        description: "The home page"
    },
    blog: {
        title: "Blog",
        description: "Our blog"
    }
};

$.each(pages, function(key, value) {
    value.jsonKey = key;
}

现在我有三种不同的方法,但我真的不喜欢其中任何一种。我认为这应该是一个相当普遍的问题,那么您将如何处理这个问题?如果派生属性要被多次使用,该怎么办?

为什么要以不同的形式存储相同的数据,而您已经将其存储在一种形式(您的密钥)中了。

在我看来,不要使用任何一种方法,因为无论何时,只要您希望获取某个特定页面的
文件
url
,您都可以从
页面轻松获取。key

为什么要将相同的数据存储在不同的表单中,而您已经将其存储在一种表单(您的密钥)中了。

在我看来,不要去做任何这些,因为每当你想得到一个特定的页面的<代码>文件>代码>代码> URL >代码>时,你可以很容易地从<代码>页面获得。这似乎在逻辑上更加一致,并解决了冗余问题

var pages = [
    {
        key: 'home'
        title: "Home",
        description: "The home page",
    },
    {
        key: 'blog',
        title: "Blog",
        description: "Our blog",
    }
];

另外。您可以为页对象创建类,并使用计算派生属性的方法(可选地缓存它们,以防您认为重复访问是昂贵的。但是,对于简单的字符串连接来说,这样做似乎是一个过份)

您应该考虑将页面存储为对象列表而不是具有属性的对象。这似乎在逻辑上更加一致,并解决了冗余问题

var pages = [
    {
        key: 'home'
        title: "Home",
        description: "The home page",
    },
    {
        key: 'blog',
        title: "Blog",
        description: "Our blog",
    }
];

另外。您可以为页面对象创建类,并使用计算派生属性的方法(如果您认为重复访问成本很高,可以选择缓存它们。但是,对于简单的字符串连接这样做似乎有点过分)

我没有做到这一点,但实际上我需要根据它们的密钥访问页面。根据它们的URL,实际上不带前导“/”,这等于key.AFAIK,如果不在页面对象中重复key,就无法从对象中访问密钥。这些键不是单个页面对象的一部分。注意:在我的解决方案中,您仍然可以按键查找页面(您只需要在列表中搜索,当然这比对象属性访问要慢)。我未能做到这一点,但实际上我需要根据页面的键来访问页面。根据它们的URL,实际上不带前导“/”,这等于key.AFAIK,如果不在页面对象中重复key,就无法从对象中访问密钥。这些键不是单个页面对象的一部分。注意:在我的解决方案中,您仍然可以按键查找页面(您只需要搜索列表,当然这比对象属性访问要慢)。但是我应该如何访问键?考虑我调用某个函数(页[Health]),某个函数只能访问页面对象。我宁愿复制值中的键,也不愿将其传递给每个处理页面的函数。但是我应该如何访问该键呢?考虑我调用某个函数(页[Health]),某个函数只能访问页面对象。我宁愿复制值中的键,也不愿将其传递给每个处理页面的函数。