6

この配列があり、各インデックスにはオブジェクトリテラルが含まれています。すべてのオブジェクトリテラルは同じプロパティを持っています。一部のオブジェクトリテラルは特定のプロパティに対して同じ値を持っているので、それらのオブジェクトリテラル のみを含む新しい配列を作成したいと思います。

私の考えは、配列を並べ替えて、新しい配列にスライスすることです...

配列は次のとおりです。

var arr = [];

arr[0] =
{
    country: "United States",
    num: 27
};

arr[1] =
{
    country: "Australia",
    num: 5
};

arr[2] =
{
    country: "United States",
    num: 7
};


countryそこで、プロパティが「UnitedStates」 であるオブジェクトのみを含む新しい配列を作成したいと思います。これはこれまでの私のクレイジーなアイデアですが、機能しません。

function getNewArray(arr)
{
    var arr2 = [];

    for(var key in arr)
    {
        for(var i = 0; i < arr.length - 1; i++)
        {
            if(arr.hasOwnProperty(key) && arr[i].name == arr[i + 1].name)
            {
                    arr2[i] = arr.slice(key);
            }
        }
    }

    return arr2;
}

var arr3 = getNewArray(arr).sort();
4

6 に答える 6

4

「プロパティの国が「米国」であるオブジェクトのみを含む新しい配列を作成したい」

これはまさにArray.filter()メソッドの目的です。

var filteredArray = arr.filter(function(val, i, a) {
                                  return val.country==="United States";
                    });

この.filter()メソッドはバージョン 9 より前の IE では使用できないことに注意してください。ただし、上記でリンクした MDN ページには、その実装方法が正確に示されているため、そのページを読むだけで質問に答えることができます。

質問の(動作していない)コードでは、2つのforループは基本的に互いに同じことを行っていることarrに注意してください. 配列で for..in ループを使用するべきではありませんが、使用すると、key値が数値インデックスになり、各インデックスに格納されているオブジェクトのプロパティが何らかの形で取得されません。

編集:

「一部のオブジェクト リテラルは、特定のプロパティに対して同じ値を持ちます。これらのオブジェクト リテラルのみを含む新しい配列を作成したいと考えています。」

OK、これを読み直すと、国を指定して要素を選択するのではなく、エントリが重複している国の要素を選択したかったのではないでしょうか? それで、すべて「ニュージーランド」を含む別の 3 つの要素があった場合、「米国」のものに加えてそれらを選択したいと思いますか? もしそうなら、あなたはこのようなことをすることができます:

var countryCount = {},
    i;
for (i = 0; i < arr.length; i++)
    if (countryCount.hasOwnProperty(arr[i].country)
       countryCount[arr[i].country]++;
    else
       countryCount[arr[i].country] = 1;

var filteredArr = arr.filter(function(val, i, a) {
                      return countryCount[val.country] > 1;
                  });
于 2012-05-31T05:35:10.063 に答える
2
var getCountry = function (country) {
    var out = [];
    for (var i = 0, len = arr.length; i < len; i++)
        if (arr[i].country === country) out.push(arr[i]);
    return out;
};

デモ: http: //jsfiddle.net/YwytD/1/

于 2012-05-31T05:41:37.307 に答える
2

これを行うにはもっと簡単な方法があります。これがあなたが望むものだと思います。これ var new_arr = arr.filter(function(obj){ return obj['country'] === 'United States'; }) により、結果が new_arr にフィルターされます。

編集:おっと、今あなたの質問を得ました

回答: ネストされたフィルター :)

function getKeyStuff(key) {
    return arr.filter( function(obj) { 
        var new_arr = arr.filter( function(inner_obj) { 
            return inner_obj[key] === obj[key]; 
        });
        return new_arr.length > 1; 
    });
}
于 2012-05-31T05:34:52.980 に答える
1

JQueryは使えますか?

var arr = [];
arr[0] = { country: "United States", num: 27 };
arr[1] = { country: "Australia", num: 5 };
arr[2] = { country: "United States", num: 7 };

var newArray = [];
$.each(arr, function(){
   if(this.country == "United States")
      newArray.push(this);
});
于 2012-05-31T05:38:14.867 に答える
1

これが私の解決策です:

// assuming arr is already set

var num_obj = arr.length;
var obj_by_country = {}, obj;
for (var i = 0; i < num_obj; i++) {
  obj = arr[i];
  if (!obj_by_country[obj.country]) {
    obj_by_country[obj.country] = [];
  }
  obj_by_country[obj.country].push(obj);
}

// build final array
var final_array = [];
for (i in obj_by_country) {
  if (obj_by_country[i].length > 1) {
    final_array.push(obj_by_country[i]);
  }
}
于 2012-05-31T05:34:32.663 に答える
0
getByKey = function(arr, key, value) {
    var results = [];
    for(var i = 0; i < arr.length; i++) {
       if(arr[i][key] === value) {
           results.push(arr[i]);
       }
    }
    return results
}

ここに実際の例があります http://jsfiddle.net/michaelghayes/UyHYz/2/

于 2012-05-31T05:34:28.190 に答える