2016-04-30 4 views
11

オブジェクトの最初のキーを返し、私はのようなオブジェクトを持っている:Lodash:その値(すなわち配列)、それに与えられた要素(すなわち文字列)を持つ

var obj = { 
    "01": ["a","b"], 
    "03": ["c","d"], 
    "04": ["e","c"] 
}; 

と私は配列要素(例えば「c」を知っています)最初のキー値、つまり "03"を見つけ出すにはどうすればいいでしょうか?

私はこの使用してlodashようにし、それ以外の場合は試してみました:

var rId = ""; 
_.forOwn(obj, function (array, id) { 
    if (_.indexOf(array, "c") >= 0) { 
      rId = id; 
      return false; 
    } 
}); 

console.log(rId); // "03" 

期待される結果:最初のキーすなわち "03" の要素が他に一致する場合は、 ""。コメントを見た後

は今、私はまた、約

を知って興味が私はネイティブJavaScriptで行く必要がない(私たちはブロック場合は2つ以上を使用する場合、ハードケースにプログラムを読み込むために)、またはlodash way(読みやすいプログラムソリューション)

+0

希望の結果を追加してください。 –

+0

ネイティブのjavascriptソリューションはどうですか? – RomanPerekhrest

+0

ロダッシュなし:https://jsfiddle.net/rayon_1990/5pd8sq5g/ – Rayon

答えて

20

あなただけのシンプルなLodashコマンドを使用して鍵を見つけることができるようにする方法をしたいので、次のように動作するはずです:

_.findKey(obj, function(item) { return item.indexOf("c") !== -1; }); 

または、ES6の構文を使用して、

_.findKey(obj, (item) => (item.indexOf("c") !== -1)); 

このリターンあなたの例は "03"です。

findKey()の2番目の引数である述語関数は、キーの値に自動的にアクセスできます。述語関数に一致するものが見つからない場合はundefinedが返されます。

findKey()のドキュメントはhereです。ドキュメントから取ら


例:代替ソリューションとして

var users = { 
    'barney': { 'age': 36, 'active': true }, 
    'fred': { 'age': 40, 'active': false }, 
    'pebbles': { 'age': 1, 'active': true } 
}; 

_.findKey(users, function(o) { return o.age < 40; }); 
// → 'barney' (iteration order is not guaranteed) 

// The `_.matches` iteratee shorthand. 
_.findKey(users, { 'age': 1, 'active': true }); 
// → 'pebbles' 

// The `_.matchesProperty` iteratee shorthand. 
_.findKey(users, ['active', false]); 
// → 'fred' 

// The `_.property` iteratee shorthand. 
_.findKey(users, 'active'); 
// → 'barney' 
+0

私はnode.jsプログラミングをやっています。今私も知りたいのは興味があります ネイティブのjavascript(プログラムを読みにくい)やlodashの方法(読みやすいプログラム)を使う必要がありますか? –

+0

@SandeepSharmaあなたのニーズと要件に最も適しているものを使用してください。あなたがすでにLodashを持っていれば、それをつける価値はあると思います。 LodashのAPIはJavascriptのセマンティクスであったはずです。それはサーバー側であるため、Lodashを使用することに対する_real_引数はありません。クライアント上では、かさばるライブラリですが、サーバー上のライブラリサイズを気にするのは誰ですか?誰も。 _tiny_のパフォーマンスヒットがありますが、実際には違いはありません。 –

+0

@SandeepSharmaまた、Javascriptプログラムは読みにくい必要はありません。あなたのJavascriptが読みにくい場合は、それが不必要に複雑になっているからです。あなたが適切なパターンを購読する時間を取れば、JSはLodashと同様にシンプルできれいに読むことができます。結局のところ、Lodash _is_ Javascript。 –

0

Object.keysArray.some機能を使用してネイティブのJavascriptのアプローチを検討してください。

var obj = {"01": ["a","b"],"03": ["c","d"],"04": ["e","c"]}, 
     search_str = "c", key = ""; 

Object.keys(obj).some(function(k) { return obj[k].indexOf(search_str) !== -1 && (key = k); }); 
// the same with ES6 syntax: 
// Object.keys(obj).some((k) => obj[k].indexOf(search_str) !== -1 && (key = k)); 

console.log(key); // "03" 
+0

ES6構文を使用すると、これを少し読みやすくなります。 –

+0

@AkshatMahajan、コメントとして追加 – RomanPerekhrest

1

ここから単一のライナーの回答が来ます未来。現在のところ、Firefox 47でのみ動作します。 ES7提案の一部。

var obj = { 
 
    "01": ["a","b"], 
 
    "03": ["c","d"], 
 
    "04": ["e","c"] 
 
}, 
 
    res = Object.entries(obj).find(e => e[1].includes("c"))[0]; 
 
document.write(res);

+0

私はES7の一部ではなく、むしろES8上では(https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_Next_support_in_Mozilla)と信じています。 –

+0

あなたはおそらく最初の項目だけを検索するのではなく、配列全体を検索していないので、 'find'条件を更新するでしょう。 –

+0

@РоманПарадеевはい、私は引用符を誤解しています。私はそれに応じて修正します。ところで、あなたのソリューションは完璧で+に値する。 – Redu

6

皮肉は、それがどのLIBSなしで実装するのいずれかの困難ではないです。

Object.keys(obj).filter(x => obj[x].includes("c"))[0] 
+2

良い点! '.filter(...)[0]'の代わりに '.find(...)'を使うことさえできます:Object.keys(obj).find(x => obj [x] .includes( "c ")))' – ContinuousLoad

関連する問題