Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过迭代数组将方法分配给对象_Javascript_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript 通过迭代数组将方法分配给对象

Javascript 通过迭代数组将方法分配给对象,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,在ES5中,我知道可以通过以下方式使用forEach循环将方法分配给对象: var myMethods = [ { name: 'start', src: someFn }, { name: 'stop', src: someOtherFn } ]; var myObject = {}; myMethods.forEach(function(method) { myObject[method.name] = method.src; });

在ES5中,我知道可以通过以下方式使用forEach循环将方法分配给对象:

var myMethods = [
  {
    name: 'start',
    src: someFn
  },
  {
    name: 'stop',
    src: someOtherFn
  }
];

var myObject = {};

myMethods.forEach(function(method) {
  myObject[method.name] = method.src;
});
在ES2015或ES6中,是否可以在创建对象的同时定义这些方法?下面是一个示例,说明了我可能期望它如何工作:

// example
const myObject = {
  [...myMethods.map((method) => method.name)]: [...myMethods.map(method) => method.src)]
}
最终结果如下所示:

const myObject = {
  start: someFn,
  stop: someOtherFn
}
如果有一种方法可以迭代这些方法并将它们分配给myObject,我很乐意重新构造myMethods数组,这样就可以了

最终目标是能够在一个外部模块中分配这些方法中的每一种,而不必重复定义。

应该可以为您实现这一点。请注意,可选的第二个参数用于从开头的空对象开始

var myMethods=[{ 名称:“开始”, src:函数{ console.log'started' } }, { 名称:“停止”, src:函数{ 控制台。记录“已停止” } }]; var myObject=myMethods.reduceobj,method=>{ obj[method.name]=method.src; 返回obj; }, {} console.logmyObject myObject.start myObject.stop尝试在myMethods assignnemts的同一行中分配给myObject

var myObject = {};

someFn = function(){console.log(this)};
someOtherFn = function(){console.log(this)};

var myObject = {};

someFn = function(){};
someOtherFn = function(){}

var myMethods = [
  {
    name: (myObject["start"] = "start"),
    src: (myObject["start"] = someFn)
  },
  {
    name: (myObject["stop"] = "stop"),
    src: (myObject["stop"] = someOtherFn)
  }
];
是的,您可以将Object.assign和spread运算符与计算属性名称结合使用来执行此操作

var myObject = Object.assign({}, ...myMethods.map(({name, src}) => ({[name]: src})));

首先,我们将myMethods映射到一个由little-one属性对象组成的数组,其键由name属性的值和src属性的值给出。然后我们使用扩散算子。。。将这些传递给Object.assign作为参数。Object.assign然后为我们将它们粘在一起。

很公平,但我将继续假设使用reduce对OP来说是新的,否则他已经在forEach解决方案上使用它了。您也可以使用Object.assign。e、 g.myMethods.reduceobj,method=>Object.assignobj,{[method.name]:method.src},{};所以你会得到一些ES6的好处。一个好的一行代码和详细的解释永远不要在生产中使用这段代码。这是伟大的,它可以在几个符号,但它浪费了大量的计算机时间来创建不必要的对象:减少可能是更好的情况