-1

配列がある場合:

my_array = [{a:3,b:4,c:7},{a:5,b:8,c:6}]
property_names = ["a","c"]

my_arrayに対してproperty_names配列を使用して、次の出力を取得するにはどうすればよいですか?:

subset_array = [[3,7],[5,6]]
4

3 に答える 3

9
var my_array = [{a:3,b:4,c:7}, {a:5,b:8,c:6}];
var keys = ['a', 'c'];

my_array.map(function(d){
    return keys.map(function(k) {
        return d[k];
    });
});

これはあなたに与え、あなた[[3, 7], [5, 6]]が望むもののようです。


[廃止された最初の回答; OPが彼の質問を更新する前に]

使用o.aしてくださいo.c-魔法は関係せず、子猫に害はありません!

[]構文:o['a']および-を使用することもできますが、通常は、動的プロパティ名(つまり、内部の引用符文字列の代わりに変数)o['c']にアクセスする場合にのみ使用します。[]


両方の値を持つ配列が必要な場合:

var a_and_c = [o.a, o.c];

これで、とを使用a_and_c[0][1]てこれら2つの値にアクセスできます。

于 2012-05-14T14:39:45.757 に答える
4

次の2つの表記でプロパティにアクセスできます。

andまたはand 。o.a_o.co['a']o['c']


編集

両方の値を含む新しい配列を作成する場合は、たとえば@Reidによって提案されたコードを使用して作成します。

[o.a, o.c]

2回目の編集

mapしたがって、次のように関数内に配列を構築するだけです。

var filter = ["a"、 "c"、 "f"、 "zzz"]; // したほうがいい

subset_array = my_array.map(function(v){var newArr = [];

for( var i=0; i<filter.length; ++i ) {
  if ( typeof v[ filter[i] ] !== 'undefined' ) {
    newArr.push( v[ filter[i] ] );
  }
}

return newArr;

});

ただし、プリミティブ型(例のint値など)を使用している限り、上記のコードはプロパティのクローンを作成することに注意してください。my_arrayつまり、ある時点で値を変更しても、暗黙的に変更されることはありませんが、そこで値を再作成subset_arrayまたは調整subset_arrayする必要もあります。

于 2012-05-14T14:40:04.247 に答える
1

これは完全な答えではありませんが、役立つと思います。

var values = []
var obj = {a: 1, b: 2, c: 3}
for (var prop in obj) {
  if (obj.hasOwnValue(prop)) { // skip props in [[prototype]], no effect here
    values.push(obj[prop])
  }
}
values // -> [2, 1, 3] (in SOME UNDEFINED ORDER)

キーポイント:

  1. オブジェクトの[すべて]オブジェクトプロパティ名を繰り返します(ただし、[[prototype]]チェーンは繰り返しません)
  2. プロパティ名から動的に値にアクセスする
  3. プロパティは順序付けられていません; valuesたとえば、必要に応じて並べ替えます

これを拡張して、たとえば、さまざまな「除外」ルールを追加できます。また、さまざまな高階関数に適合させることもできます。

ハッピーコーディング。

于 2012-05-14T14:53:14.453 に答える