数组到对象 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....]
部分。并以某种方式 inline 进行转换。
我已经读完了mozilla: Destructuring assignment but I could not see it there. (but I may have understood it wrong) and I am really not clever enough to understand ECMA: ES6 Spec。
我怀疑这是不可能的,上面已经是我能做到的最简单的了。
但是,如果我可以不创建 videos
、video_count
和 page
tmp 变量,我会更开心。
使用给定的属性和名称,这可能是实现所需结果的最短方法。
但是,如果您有更多字段,可以使用 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);
你可以直接在函数参数中解构
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
您似乎执意要以某种方式缩短代码,所以开始吧。在这种情况下,"making it shorter"表示先加长。
// 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 }
我想看看在 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....]
部分。并以某种方式 inline 进行转换。
我已经读完了mozilla: Destructuring assignment but I could not see it there. (but I may have understood it wrong) and I am really not clever enough to understand ECMA: ES6 Spec。
我怀疑这是不可能的,上面已经是我能做到的最简单的了。
但是,如果我可以不创建 videos
、video_count
和 page
tmp 变量,我会更开心。
使用给定的属性和名称,这可能是实现所需结果的最短方法。
但是,如果您有更多字段,可以使用 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);
你可以直接在函数参数中解构
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
您似乎执意要以某种方式缩短代码,所以开始吧。在这种情况下,"making it shorter"表示先加长。
// 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 }