-1

我需要处理对象的源数组,数组中的许多对象都具有三个相同的属性值。正是这些值将用于创建新对象并将其推送到目标数组。当源数组上的另一个对象与目标数组中的一个对象具有相同的三个属性值时,目标数组上的匹配对象的访问计数将加一。

为了帮助您理解,在源数组中,每个对象都是属于用户的一顿饭的记录。在第二个数组中,我需要存储用户详细信息和他们的用餐次数。

我尝试了一些失败的解决方案,如下所示。我认为下面的代码会创建一个文字对象,通过查找它的 indexOf(-1 表示未找到)来检查它是否在目标数组中,如果未找到则将其推送。问题是它永远找不到对象,如果我搜索 3000 顿饭,第二个数组的长度为 3000!

下面的代码不会尝试存储访问次数。

userArray = new Array();
for (var i = 0; i < filteredObjects.length; i++) {
    var user = { 
        forname: filteredObjects[i].forname,
        surname: filteredObjects[i].surname,
        dincat: filteredObjects[i].dincat,
    };
    var index = userArray.indexOf(user);
    if (index = -1) {
        userArray.push(user);
    }
}
4

3 回答 3

2

这不起作用,因为user您在循环中创建的对象与您在其中添加的任何对象都不相同userArray。它们可能包含相同的键和值,但严格来说(===)它们并不相同。

为了帮助您的代码,您可以添加一个用户地图对象:

var userArray = new Array(),
userMap = {};

for (var i = 0, item; item = filteredObjects[i]; ++i) {
    var userKey = item.forname + '-' + item.surname + '-' + item.dincat;

    if (!(userKey in userMap)) {
        userArray.push({
            forname: filteredObjects[i].forname,
            surname: filteredObjects[i].surname,
            dincat: filteredObjects[i].dincat,
        });
        userMap[userKey] = true;
    }
}

用户映射是一个对象,它使用其键来确定您之前是否已经插入过用户。这通过选择用户标识符来工作,在您的情况下是名字、姓氏和 dincat 的组合。

于 2012-05-13T12:59:10.780 回答
0

indexOf 使用严格相等将搜索元素与 Array 的元素进行比较。如果两个操作数都是对象,则将它们作为对象进行比较,并且仅当两个操作数都引用同一个对象时,相等性测试才为真。在您的情况下,您每次都创建一个新对象并将其与数组中的现有对象进行比较,它将返回 false。

于 2012-05-13T12:58:31.260 回答
0

那里有几个语法错误,但代码不起作用的主要原因是您正在做的是使用您当前在数组循环中的对象的值创建一个新对象,然后在数组中查找该新对象,所以它永远不会在那里。

如果有更有效的解决方案,我实际上有点好奇,但一种可能性是

var demo = [
    {a: 'green', b: 'blue', c:'red'},
    {a: 'blue', b: 'green', c: 'not blue'},
    {a: 'green', b: 'blue', c: 'red'}       
],
records= {};



for (var i=0; i<demo.length; i++){
    if (records.hasOwnProperty(demo[i].a) &&
       records[demo[i].a].hasOwnProperty(demo[i].b) &&  
       records[demo[i].a][demo[i].b].hasOwnProperty(demo[i].c)
    ){
      //do something with a match
    } else {
        if (!records.hasOwnProperty(demo[i].a)) 
            records[demo[i].a] = {};

        if (!records[demo[i].a].hasOwnProperty(demo[i].b))
            records[demo[i].a][demo[i].b] = {};

        records[demo[i].a][demo[i].b][demo[i].c] = 'yes';
        //no match found
    }   
}

只需将您的值替换为 a、b 和 c,它应该可以工作。

于 2012-05-13T13:27:34.803 回答