好吧,这个问题一直困扰着我,所以任何帮助都将是非常感激的。
过滤问题。
以下面的数组为例。
const companies = [{name: "Company One", catagory: "Finance"}, {name: "Company Two", catagory: "Retail"}, {name: "Company Three", catagory:"Auto Shop"}];
当我看到一个 filter()
函数列为。
const retailCompanies = companies.filter(company => company.catagory === 'Retail');
我问为什么是company.catagory而不是company.catagory,而不是父数组中的文字所显示的那样?这可能看起来很琐碎,但我只需要知道这改变了哪里,以及代码是如何读取的。
谢谢你
company
是保存当前元素的回调参数,你可以给它起任何名字,大多数情况下,你会看到人们把它命名为只是 el
或者他们像这样销毁它。
const retailCompanies = companies.filter(({ catagory }) => catagory === 'Retail');
company
保持循环的当前元素,它看起来像这样。
{name: "Company One", catagory: "Finance"}
而你要比较的是 catagory
财产 'Retail'
所以你需要写
company.catagory === 'Retail'
我认为这不是高阶函数,是数组的内置方法。
过滤器的语法是。
let newArray = arr.filter(callback(element[, index, [array]])[, thisArg])
在你的例子中 company
是 element
在上面的语法中,过滤器将对给定数组中的每个元素运行回调函数,直到结束。
来源:/developer.mozilla.orgen-USdocsWebJavaScriptReferenceGlobalhttps:/developer.mozilla.orgen-USdocsWebJavaScriptReferenceGlobal_ObjectsArrayfilter。
Filter函数被传递给一个回调,然后在循环中通过传递数组中的单个值进行调用。
所以每次回调函数运行时,你都会从你的公司数组中传递一个对象,例如 {name: "Company One", catagory: "Finance"}
在第一次迭代中。{name: "Company Two", catagory: "Retail"}
在第二次迭代中,以此类推。
由于你调用了你的对象 company
你用 company.category
来访问这个对象的类别字段。您可以选择将回调函数的参数命名为任何名称,例如 item
const retailCompanies = companies.filter(item => item.catagory === 'Retail');
你可以认为过滤功能是这样实现的
Array.prototype.filter = function(callback) {
const arr = this;
const res = [];
for(let i = 0; i < arr.length; i++) {
if(callback(arr[i], i)) { // call the callback function with the ith item
res.push(arr[i]);
}
}
return res;
}