Node.js 在动态命名对象中调用方法

Node.js 在动态命名对象中调用方法,node.js,Node.js,我试图调用一个动态命名对象的方法 我有几个对象,每个对象都包含一个名为“getWeight”的方法。我需要调用这些对象子集的这个方法。然而,对象的子集取决于用户输入的信息,这就是为什么我试图在循环中动态构造对象名并调用它的“getWeight”方法 我的代码如下: // Importing objects containing 'getWeight' method const Apple = require('../classses/Apple'); const Pear = require('

我试图调用一个动态命名对象的方法

我有几个对象,每个对象都包含一个名为“getWeight”的方法。我需要调用这些对象子集的这个方法。然而,对象的子集取决于用户输入的信息,这就是为什么我试图在循环中动态构造对象名并调用它的“getWeight”方法

我的代码如下:

// Importing objects containing 'getWeight' method
const Apple = require('../classses/Apple');
const Pear = require('../classes/Pear);
const Carrot = require('../classes/Carrot);
const Potato = require('../classes/Potato);

const promises = {};
const user = 'userX';  // This is the inputted info, could also equal 'userY'.
const searchableFoods = {
  userX: ['Apple', 'Pear'],
  userY: ['Carrot', 'Potato']
};

for (i = 0; i < searchableFoods[user].length; ++i) {
  promises[searchableFoods[user][i]] = new Promise(function(resolve, reject) {
    // Below line should behave like: Apple.getWeight(arg1, function....
    searchableFoods[user][i].getWeight(arg1, function(response) {
      resolve(response);
    })
  })
}

我尝试了很多变化,但都没成功。可以这样做吗?

您可以定义不使用字符串的数组吗?像这样的

const searchableFoods = {
  userX: [Apple, Pear],
  userY: [Carrot, Potato]
};

您能定义不使用字符串的数组吗?像这样的

const searchableFoods = {
  userX: [Apple, Pear],
  userY: [Carrot, Potato]
};

需要将所有这些变量都放入一个对象中,而不是许多独立变量中,然后可以使用简单的属性查找来获得相应的
Require
ed值。另外,
forEach
可能会产生更可读的代码,您可以单独传递函数名(
resolve
),而不是为
getWeight
回调定义额外的匿名函数:

const foods = {
  Apple: require('../classses/Apple'),
  Pear: require('../classes/Pear),
  Carrot: require('../classes/Carrot),
  Potato: require('../classes/Potato)
};

// ...

searchableFoods[user].forEach((foodName) => {
  promises[foodName] = new Promise((resolve) => {
    foods[foodName].getWeight(arg1, resolve);
  });
});

需要将所有这些变量都放入一个对象中,而不是许多独立变量中,然后可以使用简单的属性查找来获得相应的
Require
ed值。另外,
forEach
可能会产生更可读的代码,您可以单独传递函数名(
resolve
),而不是为
getWeight
回调定义额外的匿名函数:

const foods = {
  Apple: require('../classses/Apple'),
  Pear: require('../classes/Pear),
  Carrot: require('../classes/Carrot),
  Potato: require('../classes/Potato)
};

// ...

searchableFoods[user].forEach((foodName) => {
  promises[foodName] = new Promise((resolve) => {
    foods[foodName].getWeight(arg1, resolve);
  });
});

您试图将
getWeight
作为string
'Apple'
的属性而不是您要导入的实际对象
Apple
的属性来访问

将子集数组更改为如下内容

const searchableFoods = {
  userX: [Apple, Pear],
  userY: [Carrot, Potato]
};
这使得最终的代码

const Apple = require('../classses/Apple');
const Pear = require('../classes/Pear);
const Carrot = require('../classes/Carrot);
const Potato = require('../classes/Potato);

const promises = {};
const user = 'userX'  // This is the inputted info, could also equal 'userY'.
const searchableFoods = {
  userX: [Apple, Pear],
  userY: [Carrot, Potato]
};

for (i = 0; i < searchableFoods[user].length; ++i) {
  promises[searchableFoods[user][i]] = new Promise(function(resolve, reject) {
    // Below line should behave like: Apple.getWeight(arg1, function....
    searchableFoods[user][i].getWeight(arg1, function(response) {
      resolve(response);
    })
  })
}
const Apple=require('../classses/Apple');
const Pear=require('../classes/Pear);
const Carrot=require('../classes/Carrot);
常量Potato=require('../classes/Potato);
常量承诺={};
const user='userX'//这是输入的信息,也可以等于'userY'。
const Searchable Foods={
userX:[苹果,梨],
乌瑞:[胡萝卜,土豆]
};
对于(i=0;i
您试图将
getWeight
作为string
'Apple'
的属性而不是要导入的实际对象
Apple
的属性来访问

将子集数组更改为如下内容

const searchableFoods = {
  userX: [Apple, Pear],
  userY: [Carrot, Potato]
};
这使得最终的代码

const Apple = require('../classses/Apple');
const Pear = require('../classes/Pear);
const Carrot = require('../classes/Carrot);
const Potato = require('../classes/Potato);

const promises = {};
const user = 'userX'  // This is the inputted info, could also equal 'userY'.
const searchableFoods = {
  userX: [Apple, Pear],
  userY: [Carrot, Potato]
};

for (i = 0; i < searchableFoods[user].length; ++i) {
  promises[searchableFoods[user][i]] = new Promise(function(resolve, reject) {
    // Below line should behave like: Apple.getWeight(arg1, function....
    searchableFoods[user][i].getWeight(arg1, function(response) {
      resolve(response);
    })
  })
}
const Apple=require('../classses/Apple');
const Pear=require('../classes/Pear);
const Carrot=require('../classes/Carrot);
常量Potato=require('../classes/Potato);
常量承诺={};
const user='userX'//这是输入的信息,也可以等于'userY'。
const Searchable Foods={
userX:[苹果,梨],
乌瑞:[胡萝卜,土豆]
};
对于(i=0;i
非常感谢!这是正确的答案。感谢forEach和Resolution提示。非常感谢!这是正确的答案。感谢forEach和Resolution提示。感谢Vladimir。不幸的是,使用此选项承诺无效。感谢Vladimir。不幸的是,使用此选项承诺无效。感谢Revanth。不幸的是,promises用这个不行。谢谢你。不幸的是,承诺用这个不行。