-1

オブジェクトのソース配列を処理する必要があります。配列内のオブジェクトの多くには、同じになる3つのプロパティ値があります。新しいオブジェクトを作成し、それを宛先配列にプッシュするために使用されるのは、これらの値です。ソース配列上の別のオブジェクトが、宛先配列上のオブジェクトの1つと同じ3つのプロパティ値を思い付くと、宛先配列上の一致するオブジェクトの訪問数が1つ増えます。

理解しやすいように、ソース配列では、各オブジェクトはユーザーに属する食事のレコードです。2番目の配列には、ユーザーの詳細と食事の数を格納する必要があります。

以下のように失敗したいくつかの解決策を試しました。以下のコードはリテラルオブジェクトを作成すると思いました。それが宛先配列にあるかどうかを、indexOf(見つからない場合は-1)を見つけて確認し、見つからない場合はプッシュします。問題は、オブジェクトが見つからないことです。3000食を検索すると、2番目の配列の長さが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;
    }
}

ユーザーマップは、そのキーを使用して、以前にユーザーを挿入したことがあるかどうかを判断するオブジェクトです。これは、ユーザーIDを選択することで機能します。この場合、名、名前、およびdincatの組み合わせです。

于 2012-05-13T12:59:10.780 に答える
0

indexOfは、厳密な等式を使用して検索要素を配列の要素と比較します。両方のオペランドがオブジェクトである場合、それらはオブジェクトとして比較され、同等性テストは、両方が同じオブジェクトを参照している場合にのみ真になります。あなたの場合、毎回新しいオブジェクトを作成し、それを配列内の既存のオブジェクトと比較すると、falseが返されます。

于 2012-05-13T12:58:31.260 に答える
0

そこにはいくつかの構文エラーがありますが、コードが機能しない主な理由は、現在配列ループにあるオブジェクトの値を使用して新しいオブジェクトを作成し、配列内でその新しいオブジェクトを探すことです。だから、そこにあることは決してないだろう。

より効率的な解決策があるかどうか私は実際に少し興味がありますが、1つの可能性は

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 に答える