[英]Array to Object es6 javascript
我試圖看看是否有一種較小的方法將數組轉換為es6中的對象。 (我不必擔心跨瀏覽器)
我目前有:
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閱讀:解構分配,但我在那里看不到它。 (但我可能已經理解錯了)而且我真的不夠聰明,無法理解ECMA:ES6 Spec 。
我懷疑這是不可能的,上面已經是最簡單的我可以做到的。 但是,如果我不能創建videos
, video_count
和page
tmp變量,我會更高興。
您可以在函數參數中進行結構化
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
通用程序zip
, assign
和obuild
應該為我們提供我們需要的東西。 這遠遠優於@ CodingIntigue的答案,因為它不是一個試圖完成所有任務的大功能。 將它們分開意味着降低復雜性,提高可讀性和可重用性。
// 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 }
使用給定的屬性和名稱,這可能是實現所需結果的最短途徑。
但是,如果您有更多字段,則可以使用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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.