繁体   English   中英

数组到对象es6 javascript

[英]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

我怀疑这是不可能的,上面已经是最简单的我可以做到的。 但是,如果我不能创建videosvideo_countpage 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

通用程序zipassignobuild应该为我们提供我们需要的东西。 这远远优于@ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM