如何创建对象的对象键的变量对象键?

时间:2013-07-27 21:21:32

标签: javascript jquery

好的,所以我有一个搜索结果对象数组,其中一个对象属性值(显示值)与搜索匹配。该数组的结构如下,可能包含任意数量的不同对象:

results = [
    {
        day: value,
        time: value,
        show: value,
        sid: value,
        network: value,
        title: value,
        ep: value,
        link: value,
    }
];

我正在尝试将所有结果合并到一个大对象中,合并具有相同值的任何日期或时间。但是,我不能单独看每一天或每个时间的价值。例如,如果星期二晚上9点,我需要在星期一晚上9点保留。

为此,我尝试创建一个新的对象结构:

for ( var i=0; i<results.length; i++ ) {
    var uniqtime = results[i]["time"];
    var uniqshow = results[i].show;
    uniqresults[results[i].day] = {
        uniqtime: {
             uniqshow: {
                sid: results[i].sid,
                network: results[i].network,
                title: results[i]["title"],
                ep: results[i].ep,
                link: results[i]["link"]
            }
        }
    };
}

但显然这不起作用,因为变量子对象键名称被视为字符串。

如果我尝试创建变量子对象/键,如下所示:

for ( var i=0; i<obj.length; i++ ) {
    uniqresults[results[i].day] = {};
    uniqresults[results[i].day][results[i]["time"]] = {};
    uniqresults[results[i].day][results[i]["time"]][results[i].show] = {
        sid: obj[i].sid,
        network: results[i].network,
        title: results[i]["title"],
        ep: results[i].ep,
        link: results[i]["link"]
    };
}

我确实可以创建正确的键名,但我被迫声明一个空对象来定义每个键(uniqresults[obj[i].day] = {}&amp; uniqresults[obj[i].day][obj[i]["time"]] = {})。如果我不这样声明它将不允许我插入我需要的其他子键/值。但是,这样声明不允许我正确地合并我的结果数组,因为每次我读取新的结果对象时,我基本上都会清空子键名称!

也许我让它变得比它应该更复杂。也许有一种更简单的方法或方式下划线或jquery可以简化我手头的任务。无论如何,我现在非常渴望找到一个合适的解决方案。

3 个答案:

答案 0 :(得分:2)

我不知道对于更广泛的问题是否有更简洁的解决方案,但每次覆盖子对象的问题可以通过在创建之前检查它们是否已经存在来解决。

在JS中执行此操作的相对紧凑和惯用的方法是使用||运算符,与大多数语言不同,它返回评估为true的参数,而不仅仅是布尔值true

uniqresults[results[i].day] = uniqresults[results[i].day] || {};

第一次,uniqresults[results[i].day]将是未定义的,因此评估为false,因此将分配{};然而,随后,它将是一个对象,其计算结果为true,因此只需将变量赋值给自己,保持不变。

答案 1 :(得分:2)

在重新定义这些对象时,似乎可以使用条件检查。

var day, time;
for ( var i=0; i<obj.length; i++ ) {
    // Instantiate the day reference if it doesn't exist
    day = uniqresults[results[i].day] = uniqresults[results[i].day] || {};

    // Instantiate the time reference if it doesn't exist
    time = day[results[i].time] = day[results[i].time] || {};

    time[results[i].show] = {
        sid: obj[i].sid,
        network: results[i].network,
        title: results[i]["title"],
        ep: results[i].ep,
        link: results[i]["link"]
    };
}

干杯!

答案 2 :(得分:0)

仅当对象的键不存在时才创建空对象:

if(!(results[i].day in uniqresults)){
   uniqresults[results[i].day] = {};
}

对于子键等等。