0

これを実現するために .filter を使用できることは承知していますが、実装方法がわかりません。

配列内に次のようなオブジェクトがあります

item {
  title : g.attributes.title,
  category : g.attributes.categoryid,
  possible: g.attributes.possible
}

ただし、配列内の一部の項目には、NaN の可能性のあるプロパティがあります。

可能なプロパティが NaN でないアイテムのみが配列にプッシュされるようにする必要があります。

これが私の完全なコードの抜粋です:

function load(id){
   itemPath = lev1.lev2.lev3;
   items = [];
   for (var i = 0; i<itemPath.length; i++) {
      if(itemPath[i].attributes.id==id) {
         return itemPath[i].attributes.grades.models.map(function(g) {
            items.push(
               {
                  title : g.attributes.title,
                  category : g.attributes.categoryid,
                  possible: g.attributes.possible
               });
         });
      }
   }
}
4

4 に答える 4

1

テストラインをから変更するだけです

if(itemPath[i].attributes.id==id)

チェックしたいプロパティでisNaN関数を使用するには

var attr = itemPath[i].attributes;
if (attr.id==id && !isNaN(attr.title) && !isNaN(attr.categoryid) && !isNaN(attr.possible))
于 2013-03-05T17:41:14.023 に答える
1
function load(id){
   itemPath = lev1.lev2.lev3;
   items = [];
   for (var i = 0; i<itemPath.length; i++) {
      if(itemPath[i].attributes.id==id) {
         return itemPath[i].attributes.grades.models.map(function(g) {
            if(g.attributes.possible !== g.attributes.possible){
               return;
            }


            items.push(
               {
                  title : g.attributes.title,
                  category : g.attributes.categoryid,
                  possible: g.attributes.possible
               });
         });
      }
   }
}

NaN は、それ自体と等しくない JavaScript の唯一のプロパティです。プロパティをループしてこれを確認するか、他の場所で提案されているように、ループ内で組み込みの NaN() 関数を使用します。

アップデート

可能なプロパティのみが心配なので、===self または isNaN()を使用して if ステートメントの一部として確認してください。

于 2013-03-05T17:40:03.853 に答える
0

を使用してisNaN()、追加する前にテストできます...

function load(id){
   itemPath = lev1.lev2.lev3;
   items = [];
   for (var i = 0; i<itemPath.length; i++) {
      if(itemPath[i].attributes.id==id) {
         return itemPath[i].attributes.grades.models.map(function(g) {
            if( isNaN(g.attributes.title) || isNaN(g.attributes.categoryid) || isNaN(g.attributes.possible)  ){
            items.push(
               {
                  title : g.attributes.title,
                  category : g.attributes.categoryid,
                  possible: g.attributes.possible
               });
            }
         });
      }
   }
}
于 2013-03-05T17:39:30.950 に答える
0

あなたのコードは少し混乱しています

function load(id){
   itemPath = lev1.lev2.lev3;
   items = [];
   for (var i = 0; i<itemPath.length; i++) {
      if(itemPath[i].attributes.id==id) {
         return itemPath[i].attributes.grades.models.map(function(g) {
            items.push(
               {
                  title : g.attributes.title,
                  category : g.attributes.categoryid,
                  possible: g.attributes.possible
               });
         });
      }
   }
}

正しいマップを使用しているようには見えません。Map は、シーケンスを反復処理して各要素に対して何らかの操作を実行し、新しいシーケンスを返すという意味で、リスト圧縮のように機能します。

var arr = [1,2,3];
var complexMagic = arr.map( function(n) { return n + 10; } );
// complexMagic === [11,12,13]

参考までに、これがフィルターの仕組みです。Filter は述語関数 (別名、ブール関数) を取り込んで、新しいシーケンスを構築します。述語が true を返す場合、要素は新しいシーケンスに格納されます。

var arr = [1, 123, 42, 1001, 1100];
var oddNumbers = arr.filter( function(n) {
    return 1 === (n & (-n) );
} );

// oddNumbers === [1, 123, 1001] );
// Bit hacks are fun ;P

items 配列は必要ないようですし、新しい要素をプッシュする必要さえないようです。

function load(id){
   itemPath = lev1.lev2.lev3;
   items = [];
   for (var i = 0; i<itemPath.length; i++) {
      if(itemPath[i].attributes.id==id) {
         return itemPath[i].attributes.grades.models.map(function(g) {

            // You don't have to return anything.
            // This might be an ok place for the NaN check.

            return ({
                  title : g.attributes.title,
                  category : g.attributes.categoryid,
                  possible: g.attributes.possible
               });
         });
      }
   }
}

私は怠け者で、コードをテストしていないので、読者は注意してください。また、可能であればプッシュ方式も避けてください。新しい要素を配列に追加するのは、非効率的な方法になる可能性があります。

于 2013-03-05T18:28:43.930 に答える