ES6 で最もコンパクトな方法で少数の属性のみを使用する関数を作成するにはどうすればよいでしょうか?
分解 + 簡略化されたオブジェクト リテラルを使用して解決策を考え出しましたが、フィールドのリストがコード内で繰り返されるのは好きではありません。
さらにスリムなソリューションはありますか?
(v) => {
let { id, title } = v;
return { id, title };
}
ES6 で最もコンパクトな方法で少数の属性のみを使用する関数を作成するにはどうすればよいでしょうか?
分解 + 簡略化されたオブジェクト リテラルを使用して解決策を考え出しましたが、フィールドのリストがコード内で繰り返されるのは好きではありません。
さらにスリムなソリューションはありますか?
(v) => {
let { id, title } = v;
return { id, title };
}
TC39 のオブジェクト レスト/スプレッド プロパティの提案により、これは非常に滑らかになります。
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
z; // { a: 3, b: 4 }
x
(必要のない変数と変数を作成するという欠点がy
あります。)
オブジェクトの分解を使用して、既存のオブジェクトからプロパティをアンパックし、それらを異なる名前の変数(最初は空の新しいオブジェクトのフィールド) に割り当てることができます。
const person = {
fname: 'tom',
lname: 'jerry',
aage: 100,
}
let newPerson = {};
({fname: newPerson.fname, lname: newPerson.lname} = person);
console.log(newPerson);
I required this sollution but I didn't knew if the proposed keys were available. So, I took @torazaburo answer and improved for my use case:
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => {
if (o[prop]) return {[prop]: o[prop]};
}));
}
// Example:
var person = { name: 'John', age: 29 };
var myObj = pick(person, 'name', 'sex'); // { name: 'John' }
https://stackoverflow.com/users/865693/shesekの reduce アプローチに触発されました:
const pick = (orig, keys) => keys.reduce((acc, key) => ({...acc, [key]: orig[key]}), {})
または、コンマ演算子 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator )を使用してさらに短くします。
const pick = (obj, keys) => keys.reduce((acc, key) => ((acc[key] = obj[key]), acc), {});
利用方法:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
結果:
{model: "F40", productionYear: 1987}