Javascript 如何解决函数中参数的问题?

Javascript 如何解决函数中参数的问题?,javascript,reactjs,vue.js,Javascript,Reactjs,Vue.js,我有一个函数,我在多个组件中使用它。它从组件收集数据并将其存储在数据库中。我的问题是这个函数有很多参数,其中一些可能没有在某些组件中使用。看一看: export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) { const obj = { serviceID: service, terminalID: terminal, am

我有一个函数,我在多个组件中使用它。它从组件收集数据并将其存储在数据库中。我的问题是这个函数有很多参数,其中一些可能没有在某些组件中使用。看一看:

export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) {
  const obj = {
    serviceID: service,
    terminalID: terminal,
    amountName: account,
    amount: amount,
    isSaved: isSaved,
    isSentToGateway: isSentToGateway,
  };

  const db = await InitDb();
  const tx = db.transaction('userLogs', 'readwrite');
  const store = tx.objectStore('userLogs');
  const index = await store.put(obj);
  let params = {};
  if (window.localStorage.getItem('params') !== null) {
    params = JSON.parse(window.localStorage.getItem('params'));
  }
  window.localStorage.setItem(
    'params',
    JSON.stringify({ ...params, userLogIndex: index })
  );
} 

例如,我在一个组件上传递给函数的帐户和服务参数,不需要其他参数。在另一个组件中,我只需要传递amount参数,但我需要指定以前的参数以不覆盖其他值。但有一个错误“帐户、服务、终端、isSaved、ISEntToGateway未定义”。你能建议我如何解决这个问题吗?为了更好地理解这个问题并使你的函数更通用,你应该为函数提供默认参数,这样当你不在这里传递任何项目创建时

   serviceID: service,
   terminalID: terminal,
   amountName: account,
   amount: amount,
   isSaved: isSaved,
   isSentToGateway: isSentToGateway,
 };
不会破裂。为此,请使用以下格式

export default async function addUserLogs(account="default", service = "default", terminal = "default value",isSaved = "default value",isSentToGateway = "default value",amount = "default Value" ) 

仅为调用时在其他地方不需要的变量提供默认值


注意:当您调用此函数并提供参数时,它们将替换默认值,但当您不这样做时,函数将使用默认值,因此您的函数不会因未定义的变量而中断

在该示例中,您可以为一些不需要的参数设置null,并且在调用函数时不希望使用这些参数

您可以对参数使用一些筛选器,如下所示:

export default async function addUserLogs(account, service, terminal,isSaved,isSentToGateway,amount ) {
  const obj = {};

  if(account) obj.amountName = account;
  if(service) obj.serviceID = service;
  if(terminal) obj.terminalID = terminal;
  if(isSaved !== null) obj.isSaved = isSaved;
  if(isSentToGateway !== null) obj.isSentToGateway = isSentToGateway;
  if(amount) obj.amount = amount;

  const db = await InitDb();
  const tx = db.transaction('userLogs', 'readwrite');
  const store = tx.objectStore('userLogs');
  const index = await store.put(obj);
  let params = {};
  if (window.localStorage.getItem('params') !== null) {
    params = JSON.parse(window.localStorage.getItem('params'));
  }
  window.localStorage.setItem(
    'params',
    JSON.stringify({ ...params, userLogIndex: index })
  );
} ```

addUserLogs可以接收带有可选键的对象,并将上次接收的对象与新对象合并:

export default async function addUserLogs(newParams) {
  const lastParams = <get the last params from storage>;
  const obj = Object.assign(lastParams, newParams);
  ...
} 

// usage examples
addUserLogs({amountName: 'x', serviceID: 1, terminalID: 2, isSaved: true ,isSentToGateway: false, amount: 10});
addUserLogs({isSentToGateway: false, amount: 10});
addUserLogs({amountName: 'x', serviceID: 1, terminalID: 2});
导出默认异步函数addUserLogs(newParams){
常量lastParams=;
const obj=Object.assign(lastParams,newParams);
...
} 
//用法示例
addUserLogs({amountName:'x',serviceID:1,terminalID:2,isSaved:true,IsEntToGateway:false,amount:10});
addUserLogs({isSentToGateway:false,amount:10});
addUserLogs({amountName:'x',serviceID:1,terminalID:2});
如果您想对addUserLogs签名更具声明性,可以执行以下操作链接:

export default async function addUserLogs({amountName, serviceID, terminalID, isSaved ,isSentToGateway, amount}) {
  const lastParams = <get the last params from storage>;
  const newParams = {
      amountName: amountName || lastParams.amountName, 
      serviceID: serviceID || lastParams.serviceID, 
      terminalID: terminalID || lastParams.terminalID, 
      isSaved: isSaved === undefined ? lastParams.isSaved : isSaved,
      isSentToGateway: isSentToGateway === undefined ? lastParams.isSentToGateway : isSentToGateway, 
      amount: amount === undefined ? lastParams.amount : amount
  };
  ...
}
导出默认异步函数addUserLogs({amountName、serviceID、terminalID、isSaved、isSentToGateway、amount}){
常量lastParams=;
常量newParams={
amountName:amountName | | lastParams.amountName,
serviceID:serviceID | | lastParams.serviceID,
terminalID:terminalID | | lastParams.terminalID,
isSaved:isSaved==未定义?lastParams.isSaved:isSaved,
isSentToGateway:isSentToGateway==未定义?lastParams.isSentToGateway:isSentToGateway,
金额:金额===未定义?lastParams.amount:金额
};
...
}

在JS中,参数是可选的,所以除了在函数中设置一个条件
if(arg1){do something}
等,您不需要做任何事情。因为您在创建
obj
时访问了它,但没有传递它,所以会出现错误。你应该让那些不是强制性的有默认值,这样当你不提供它们的时候就不会有任何问题。我认为你应该参考它,我认为你应该参考它-