9

必要なものの独自のバージョンを再実装しましたが、これは非常にシンプルで他の多くの機能と密接に関連しているため、既にアンダースコアに含まれていると思われます。でも何と呼べばいいのか思いつきません。

基本的に、私が欲しいのは、オブジェクトで動作し、配列の代わりにオブジェクトを返す _.pluck のバージョンです (関連付けられたキーを使用)。

たとえば、次のようなオブジェクトがあるとします。

elements: {
    steam: {
        temperature: 100,
        color: 'orange',
        state: 'gas'
    },
    water: {
        temperature: 50,
        color: 'blue',
        state: 'liquid'
    },
    ice: {
        temperature: 0,
        color: 'white',
        state: 'solid'
    }
}

電話したい_.something(elements, 'temperature')

そして返してもらう

{
    steam: 100,
    water: 50,
    ice: 0
}

その代わり_.pluck(elements, 'temperature')

[100, 50, 0]

この変換は何と呼ばれ、既にアンダースコアに含まれていますか? 私はアンダースコア (以下に含まれています) よりも jQuery に精通しているので、jQuery の each ループを使用して簡単なバージョンを自分で作成しましたが、可能であればライブラリのいずれかを使用したいと考えています。

$.objPluck = function(obj, key) {
    var ret = {};
    $.each(obj, function(k, value) {
        ret[k] = value[key];
    });
    return ret;
}
4

6 に答える 6

7

ここに ES6 アロー関数などを使用するソリューションを追加する価値があります。

Object.keys(elements).map(f=>elements[f].temperature)

これは古い JavaScript エンジンでは機能しないことに注意してください--harmony。これを Chrome 46 でテストしたところ、問題なく動作しました。

アンダースコアやロダッシュなどの追加のライブラリを必要としないという利点がありますが、もちろん新しい JS エンジンでのみ動作します。

于 2015-11-06T18:03:53.677 に答える
0

新しいバージョンでは、実際にこれを行う組み込み関数があります。

に関数の代わりに文字列を指定するとmapObject、それはプロパティ名として解釈され、" pluckObject" として動作します。ほとんどの関数は、受け入れるものに関して驚くほど自由です。

> _.mapObject(elements,'temperature')
Object {steam: 100, water: 50, ice: 0}

目的のために明示的な関数が必要な場合は、_.pluck実装方法を見て、独自の類似バージョンを作成できます。

_.mixin({
  pluckObject: function(obj, key) {
    return _.mapObject(obj, _.property(key));
  }
});

これは少し冗長ですが、意図をより明確にします。

于 2015-11-09T03:30:18.757 に答える