0

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

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

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

为此,我试图创建一个新的对象结构,如下所示:

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] = {}& uniqresults[obj[i].day][obj[i]["time"]] = {})。如果我不这样声明,它不会让我插入我需要的其他子键/值。但是,像这样声明不允许我正确合并我的结果数组,因为每次读取新结果对象时我基本上都会清空子键名称!

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

4

3 回答 3

2

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

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

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

第一次通过,uniqresults[results[i].day]将是未定义的,因此评估为false,因此{}将被赋值;然而,随后它将是一个对象,其计算结果为真,因此将简单地将变量分配给自身,使其保持不变。

于 2013-07-27T21:30:47.840 回答
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"]
    };
}

干杯!

于 2013-07-27T21:32:19.467 回答
0

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

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

对于子键等等。

于 2013-07-27T21:30:33.853 回答