ES6 JavaScript中数组转对象

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....] 部分。并且以某种方式内联进行转换。

我已经阅读了mozilla:解构赋值,但在那里没有看到它。(但我可能理解错了)并且我真的不够聪明去理解ECMA:ES6规范

我怀疑这是不可能的,以上已经是我能够使它更简单的方法了。但是如果我能够避免创建videosvideo_countpage临时变量,我会更加开心。


总是可以用老派的方式完成:var data = {videos:values[0], video_count:values[1], page:values[2]}; - Niet the Dark Absol
这是我曾经考虑过的事情,但我想看看是否有ES6的方法。似乎有一种方法可以实现我想要的几乎所有功能,我猜我找到了一个更具特殊性的用例。 - WORMSS
无论如何,您都必须为属性值命名,它们不会自动出现。 - Niet the Dark Absol
2个回答

6

您可以在函数参数中直接解构

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 }


这仍然会产生临时变量吗?虽然 values 已经消失了,但我主要想要删除的三个变量仍然存在。 - WORMSS
这比@CodingIntigue的答案要好得多。- 哎呀,虽然你说得没错,但更易读。 - CodingIntrigue
@CodingIntrigue,我真的没有恶意;我正在做一项非常烦人的任务,否则可能会用更得体的措辞。 - Mulan
1
@naomik 没关系,这并不是错误的陈述! - CodingIntrigue
@naomik,我最终使用了你提供的函数参数解构方式。这种方式看起来最整洁。非常感谢你。 - WORMSS

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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接