web-dev-qa-db-ja.com

_.pluckに相当するオブジェクトは何ですか

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

基本的に、私が欲しいのは、オブジェクトを処理し、配列の代わりにオブジェクトを返す(関連付けられたキーを持つ)バージョンの_.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の各ループを使用してクイックバージョンを自分で作成しましたが、可能であればライブラリからのものを使用したいと思います。

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

アンダースコア1.4.4でこれを正確に行う方法はありませんが、アンダースコアを維持したい場合は、

__.object(_.keys(elements), _.pluck(elements, 'temperature'))
_

jsfiddleでのデモ 礼儀 bfavaretto


アンダースコア1.8.3の時点で、これは_.mapObject(elements, 'temperature');を使用して簡潔に実行できます。

更新されたデモ

9
Mathletics

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

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

これは古いjavascriptエンジンでは機能しませんが、node.js0.12では--harmonyそれはうまく機能します、またはnode.js4.x以降でも同様に機能します。これをChrome 46でテストしたところ、正常に動作します。

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

5
taxilian

lodash(アンダースコアと同様)では、_.mapValues(elements,'temperature')を使用できます。
戻り値_{Steam: 100, water: 50, ice: 0}_

lodash ref: _。mapValues

ちなみに、__.mapKeys_を使用して1行でオブジェクトハッシュを作成できます
_.mapKeys(elements,'color') //{orange: Object, blue: Object, white: Object}

3
pery mimon

このような簡単なもののためにサードパーティのライブラリは必要ありません

// with a plain old for loop
const temps = {}
for (let key in data["elements"]) {
    dikt[key] = temps["elements"][key]["temperature"]
}
return temps

// with a reduce

Object.keys(data['elements']).reduce((acc, key) => acc[key] = data['elements'][key]['temperature'] , temps)
1
daino3

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

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

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

目的のために明示的な関数が必要な場合は、_.pluck is implemented そしてあなた自身の類似したバージョンを書いてください:

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

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

0
Hjulle

JavaScript for-in loop を使用して、オブジェクトのキーを反復処理できます。

_var list = [];

// Iterate through each object key, and pick wanted the values.
for(var name in obj)
{
    if (obj.hasOwnProperty(name) && name === "temperature")
    {
       list.Push(obj[name]);
    }
}
_

上記は単純化された例ですが、より一般的な関数にカプセル化するように簡単に変更できるはずです。また、ここでJQueryを実際に使用する必要はありません。ネイティブJavaScriptの実装が高速になります。

obj.hasOwnProperty(name)チェックは JSLint によって推奨されます。

0
Zorayr