具有多个可选参数的函数的控制台输出

ano*_*ser 1 javascript

具有多个参数的函数的控制台输出

我有这个类方法:

searchForProduct({productName, manufacturer, seller}, itemsPerPage = 20, onlyAvailable = true) {
    console.log(Searching for...) // Here's what is my question about
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

如何打印出我传递给方法的所有参数?

想要实现的是:

searchForProduct({productName: laptop});

// Output:
"Searching for productName: 'laptop'"

// or

searchForProduct({productName: "laptop", manufacturer: "Dell"});

// Output:
"Searching for productName: 'laptop', manufacturer: 'Dell'"
Run Code Online (Sandbox Code Playgroud)

等等...

另外(如果可以使用任何建议的方法)我不想打印出默认值itemsPerPageonlyAvailable即使它会被传递给方法。

更新:

哇,我没想到答案中有这么多巧妙的方法。但是我应该承认我不允许更改此功能。基本上我只需要根据我的个人需求添加此输出,因为更改此方法将“破坏一切”。

我很抱歉你花时间建议传递对象而不是破坏的参数。无论如何我都会赞成你的答案

UPD2:

我尝试了一些建议,但仍然没有达到完美的结果:

searchForProduct({productName, manufacturer, seller}, itemsPerPage = 20, onlyAvailable = true) {
    function buildString({firstArgument, secondArgument, thirdArgument}) {
        return {
            productName: (firstArgument !== undefined) ? firstArgument : "",
            manufacturer: (secondArgument !== undefined) ? secondArgument : "",
            seller: (thirdArgument !== undefined) ? thirdArgument : ""
        }
    }
    const searchString = buildString({productName, manufacturer, seller})
    const displayStr = Object.entries(searchString)
    .map(([key, val]) => key + ': ' + val)
    .join(', ');
    console.log('Searching for', displayStr);
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

buildString功能超级丑陋,但它可以在不改变原始功能的情况下工作。

但是,当并非所有参数都通过时,我遇到了一个问题

它看起来像:

"Searching for productName: "laptop", manufacturer: "Dell", seller: undefined
Run Code Online (Sandbox Code Playgroud)

我试过:

function buildString({firstArgument, secondArgument, thirdArgument}) {
        return {
            productName: (firstArgument !== undefined) ? firstArgument : delete productName,
            manufacturer: (secondArgument !== undefined) ? secondArgument : delete manufacturer,
            seller: (thirdArgument !== undefined) ? thirdArgument : delete seller
        }
    }

Run Code Online (Sandbox Code Playgroud)

但这给了我:

"Searching for productName: "laptop", manufacturer: "Dell", seller: true
Run Code Online (Sandbox Code Playgroud)

根据 MDN:

尝试删除不存在的属性时,返回 true

然而财产确实存在——它的价值不存在。所以我上面尝试的是删除没有值的对象键。目前没有成功

Cer*_*nce 5

我不会解构第一个参数 - 相反,将其字符串化或迭代其条目以提取其键和值:

const searchForProduct = (obj) => {
  console.log('Searching for', JSON.stringify(obj));
};
searchForProduct({productName: 'laptop'});
searchForProduct({productName: "laptop", manufacturer: "Dell"});
Run Code Online (Sandbox Code Playgroud)

const searchForProduct = (obj) => {
  const displayStr = Object.entries(obj)
    .map(([key, val]) => key + ': ' + val)
    .join(', ');
  console.log('Searching for', displayStr);
};
searchForProduct({productName: 'laptop'});
searchForProduct({productName: "laptop", manufacturer: "Dell"});
Run Code Online (Sandbox Code Playgroud)

您还可以使用执行相同操作的包装函数:

const searchForProductWrapper = (obj, itemsPerPage = 20, onlyAvailable = true) => {
  const displayStr = Object.entries(obj)
    .map(([key, val]) => key + ': ' + val)
    .join(', ');
  console.log('Searching for', displayStr);
  searchForProduct(obj, itemsPerPage, onlyAvailable);
};
const searchForProduct = (obj, itemsPerPage, onlyAvailable) => {
  console.log('true searchForProduct', obj, itemsPerPage, onlyAvailable);
};
searchForProductWrapper({productName: 'laptop'}, 10);
searchForProductWrapper({productName: "laptop", manufacturer: "Dell"});
Run Code Online (Sandbox Code Playgroud)