web-dev-qa-db-ja.com

オブジェクトプロパティをパラメーターとして渡す方法(JavaScript)

私が達成しようとしているものにタイトルが適切かどうかわからない

JSONの結果を配列にマッピングしています。これを繰り返し行う必要があるため、コードを1つの関数に入れたいと思います。

次の例では、繰り返します。私はitem.data1、item.data2と呼ばれるプロパティがあり、2番目の例ではitem.something1、item.something2 ...それらのプロパティを「一般的な」引数として新しく作成された関数に渡し、そこで使用する方法はありませんそれらのマップを返すために自分自身を繰り返しますか?新しい関数は、以下の2つの例と、プロパティに異なる名前を付けることができる他の場合に使用できる必要があります。

service.getData(function(data) {
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        entry.key = item.data1;
        entry.value = item.data2;

        return entry;
    });
});

service.getSomething(function(data) {
    var map = {};
    map = $.map(data, function(item, i) {
        var entry = {};

        entry.key = item.something1;
        entry.value = item.something2;

        return entry;
    });
});
26
maze

使用する []オブジェクトからプロパティを動的に引き出す文字列。

var a = { foo: 123 };
a.foo    // 123
a['foo'] // 123

var str = 'foo';
a[str]   // 123

これは、メソッドをそのようにリファクタリングできることを意味し、文字列として読み取るプロパティの名前を渡すだけです。

var getKeyValueMap = function(data, keyPropName, valuePropName) {
  return $.map(data, function(item, i) {
    return {
      key:   item[keyPropName],
      value: item[valuePropName]
    }
  });
};

service.getData(function(data) {
  return getKeyValueMap(data, 'data1', 'data2');
});

service.getSomething(function(data) {
  return getKeyValueMap(data, 'something1', 'something2');
});
43
Alex Wayne

これは、 このフィドルiveであなただけのために作成された:D のような[]-表記の代わりに.演算子を使用して実行できます。

    var data = [{
        data1: 'foo',
        data2: 'bar',
        something1: 'sparky',
        something2: 'arf arf!'},
    {
        data1: 'My name is',
        data2: 'What?',
        something1: 'my name is',
        something2: 'Who?!'}
    ];

    function test(data, prop) {
        var d_length = data.length;
        for (var i = 0; i < d_length; i++) {
            alert(data[i][prop]);
        }
    }

    test(data, 'data1');
1
nozzleman

itemオブジェクトと項目キーのマップをエントリキーに渡す必要があります。これは、2つの配列、タプルなどの配列、またはオブジェクトのいずれかです。私が考えることができる最も簡単な方法は、記述子オブジェクトをエントリ自体に変更することです:

function mapPropertyNames(source, dest) {
    for (var prop in dest)
        dest[prop] = source[dest[prop]];
    return dest;
}

// and use it like this:

var map = $.map(data, function(item, i) {
    return mapPropertyNames(item, {key:"something1", value:"something2"});
});
0
Bergi

何かのようなもの

service.getData(function(data) {
    var map = {};
    var varNamePrefix = 'data';
    map = $.map(data, function(item, i) {
        return getProperties(item, varNamePrefix);
    });
});

service.getSomething(function(data) {
    var map = {};
    var varNamePrefix = 'something';
    map = $.map(data, function(item, i) {
        return getProperties(item, varNamePrefix);
    });
});

function getProperties(item, varNamePrefix) {
    var ret = {};
    ret.key = item[varNamePrefix + '1'];
    ret.value = item[varNamePrefix + '2'];
    return ret;
}

助けてもらえますか?

基本的に、プロパティプレフィックスを取得し、それを使用してアイテムから取得する実際のプロパティ名を形成する関数を使用できます。

0
Raibaz