0

私はJavaScriptでオブジェクトの配列を持っています。オブジェクトにはいくつかのプロパティが含まれており、次のようになります。

  { "Name" : "blabla", "Id": "1" }

これで、オブジェクトの Name プロパティ値となる単一のパラメーターを受け入れる関数ができました。関数は次のようになります。

     function CheckForExistance(array, name){
       var exist = false;

       $.each(array, function(index, value){
          if(value.Name == name)
          {
             exist = true;
             return false;
          }
       });
       return exist;
     }

これを行うためのより良い方法があるかどうか知りたいですか?

4

4 に答える 4

4

を使用$.grep()して、配列をフィルター処理して一致するものにし、の比較を返すことができます.length

 function CheckForExistance(array, name){
     return $.grep(array, function(obj) {
         return obj.Name == name;
     }).length > 0;
 }

または、ネイティブ メソッドは IMO よりも少し優れていますが、古いブラウザーには shim が必要です。

function CheckForExistance(array, name){
    return array.some(function(obj) {
        return obj.Name == name;
    });
}

これは を使用Array.prototype.someし、真の戻り値が与えられるとすぐに終了し、その後 を返しtrueます。真のリターンが見つからない場合は、 が返されますfalse


FWIW、動的プロパティ名も提供することで、関数をもう少し堅牢にすることができます。

function CheckForExistance(array, prop, val){
    return array.some(function(obj) {
        return obj[prop] == val;
    });
}

次に、それを使用してプロパティ値を確認します。

var found = CheckForExistance(myArray, "Name", "blabla");

または、別のアプローチは、イテレータで使用される関数を作成する関数ファクトリを作成することです。

function havePropValue(prop, value) {
    return function(obj) {
        return obj[prop] == value;
    };
}

次に.some()、関数を必要とせずに直接使用できCheckForExistanceます。

var found = myArray.some(havePropValue("Name", "blabla"));

またはと$.grep

var found = $.grep(myArray, havePropValue("Name", "blabla")).length > 0;
于 2012-10-28T17:25:49.857 に答える
2

$.eachそれが単純な配列オブジェクトである場合、それを単純にループするだけでなく、単純な JavaScript の方が単純な場合に使用する理由

 function CheckForExistance(array, name) {
   for(var i=0;i<array.length;i++){
     if(array[i].Name==name) return true;
   }
   return false;
 }
于 2012-10-28T17:28:43.103 に答える
0

ネイティブの Array.fiter メソッドを使用して、名前 x のオブジェクトが存在するかどうかを判断することもできます。Filter は、コールバック関数に一致するすべての要素を含む新しい配列を返します (true を返します)。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

新しい配列の長さが 0 より大きい場合は、一致する要素が少なくとも 1 つ存在します。

function checkForExistance(arrayOfItems, name) {
    return arrayOfItems.filter(function (item) {
        return item.Name === name;
    }).length > 0;

}


var arr = [{
    "Name": "blabla",
    "Id": "1"
}, {
    "Name": "foo",
    "Id": "2"
}]

console.log(checkForExistance(arr, "foo"));

http://jsfiddle.net/Uawrb/1/

これは IE<9 では機能しませんが、そこでも機能させたい場合は、jQuery の $.grep 実装をチェックアウトできます。これはクロスブラウザーで機能するはずです:)

function checkForExistance(arrayOfItems, name) {
    return $.grep(arrayOfItems, function (item) {
        return item.Name === name;
    }).length > 0;

}


var arr = [{
    "Name": "blabla",
    "Id": "1"
}, {
    "Name": "foo",
    "Id": "2"
}]

console.log(checkForExistance(arr, "foo"));​

http://jsfiddle.net/5vqqq/1/

</p>

于 2012-10-28T17:33:00.137 に答える
-1

これはうまくいくはずです:

function CheckForExistance(array, name){
           var exist = false;
           $.each(array, function(index, value){
              if (value == name) {
                   exist = true;
              }
           });
           return exist;
         }

value.Name は文字列ではありません。配列をループすると、インデックスと値が得られます。

例: array { 1: "foo", 2:"bar" } は、index: 1、value: "foo" index: 2、value: "bar" を提供します。

値は、変数「名前」と比較したいものです。

2: 'exist' を true にしてから false を返しました。それは決して「真を返す」ことはありません。'exist' を true にした後、exist を返す必要があります。

私のコードはあなたが探しているものだと思います。

于 2012-10-28T17:18:32.280 に答える