2016-10-13 9 views
2

配列をes6のオブジェクトに変換する方法がより少ないかどうかを確認しようとしています。 (私はクロスブラウザを心配する必要はありません)オブジェクトへの配列es6 javascript

私は現在持っている:

function (values) // values being an array. 
{ 
    let [videos, video_count, page] = values; 
    let data = { videos, video_count, page }; 
    someFunctions(data); 
    moreFunctions(data); 
} 

しかし、それはlet [videos....]一部、関数の最初の行をカットすることができます場合、私は思っていました。そして何とかインラインを変換します。

私はmozilla: Destructuring assignmentを読んでいるが、私はそこにそれを見ることができませんでした。 (しかし私は間違って理解しているかもしれません)と私は実際にECMA: ES6 Specを理解するのに十分な賢さではありません。

私はそれは不可能であり、上記は、すでに私はそれを作ることができる最も簡単であると思います。 しかし、私は、私は幸せだろうvideosvideo_count & page TMP変数を作成しないで逃げることができるかどうか。あなたが持っている特定のプロパティと名前の

+0

は常に昔ながらの方法行うことができます;' –

+0

それは私が考えていたものでしたが、es6の方法があるかどうかを見たいと思っていました。私が望んでいたことのほとんどすべてを行う方法があるようでした。私は、よりニッチなユースケースを見つけました。 – WORMSS

+0

あなたのプロパティ値に名前を付ける必要がありますが、いずれの方法でもどこからも出てこないでしょう。 –

答えて

6

あなたが関数内で右destructureできるが

パラメータ
function myFunc([ videos, video_count, page ]) 
{ 
    let data = { videos, video_count, page }; 
    someFunctions(data); 
    moreFunctions(data); 
} 

myFunc(values); 

私は多くを行いますデータの抽象化の

// basic abstraction 
 
const ratio = (n, d) => ({n, d}); 
 
const numer = ({n}) => n; 
 
const denom = ({d}) => d; 
 

 
// compound abstraction using selectors 
 
const ratioAdd = (x,y) => ratio(
 
    numer(x) * denom(y) + numer(y) * denom(x), 
 
    denom(x) * denom(y) 
 
); 
 

 
// or skip selectors if you're feeling lazy 
 
const printRatio = ({n,d}) => `${n}/${d}`; 
 

 
console.log(printRatio(ratioAdd(ratio(1,3), ratio(1,4)))); //= 7/12


この技術を使用してあなたは何とかコード短く作ることに地獄曲がったように見えるので、ここに行きます。この場合、は「短くしています」は最初に長くすることを意味します。

// Goal: 
obuild(keys,values) //=> ourObject 

ジェネリック手続きzipassign、およびobuildは、私たちが必要なものたちを与える必要があります。 @ CodingIntigueの答えよりもはるかに優れています。なぜなら、すべてのタスクを実行しようとする大きな機能ではないからです。それらを分離しておくことは、複雑さを軽減し、可読性と再利用性を向上させることを意味します。`VARデータは= {動画:値は、[0]、VIDEO_COUNT:値は[1]、ページ:値[2]}

// zip :: [a] -> [b] -> [[a,b]] 
 
const zip = ([x,...xs], [y,...ys]) => { 
 
    if (x === undefined || y === undefined) 
 
    return []; 
 
    else 
 
    return [[x,y], ...zip(xs,ys)]; 
 
} 
 

 
// assign :: (Object{k:v}, [k,v]) -> Object{k:v} 
 
const assign = (o, [k,v]) => Object.assign(o, {[k]: v}); 
 

 
// obuild :: ([k], [v]) -> Object{k:v} 
 
const obuild = (keys, values) => zip(keys, values).reduce(assign, {}); 
 

 
let keys = ['a', 'b', 'c']; 
 
let values = [1, 2, 3]; 
 

 
console.log(obuild(keys,values)); 
 
// { 'a': 1, 'b': 2, 'c': 3 }

+0

これはまだtmp変数で終わりますか? 「価値」は消えてしまったが、私が主に取り除こうとしていたのはまだ存在する。 – WORMSS

+0

@WORMSSあなたのために編集しました – naomik

+0

*これは@ CodingIntigueの回答*よりもはるかに優れています。あなたは間違ってはいないが、はるかに読みやすい。 – CodingIntrigue

3

、それはおそらく、あなたの望ましい結果を達成するための最短の方法です。あなたはより多くのフィールドを持っていた場合

しかし、あなたは繰り返しを避けるためにreduceを使用することができます。これは、しかし非構造ほど読みやすいではありません:あなたは、その後、一般的な機能に出ている抽象的な可能性が

let data = values.reduce((prev, val, index) => Object.assign(prev, {[["videos", "video_count", "page"][index]]: val}), {}); 

const values = ["test1","test2","test3"]; 
 
const mapArrayToObject = (array, fields) => 
 
    array.reduce(
 
    (prev, val, index) => Object.assign(prev, { [fields[index]]: val }), 
 
    {} 
 
); 
 
const data = mapArrayToObject(values, ["videos", "video_count", "page"]); 
 
console.log(data);

関連する問題