javascript - 在 JavaScript 中过滤对象数组?
问题描述
以下程序过滤给定的对象数组并返回一个包含满足条件“living:true”的对象的数组。该程序没有使用“if (test(element.living))”,而是只使用“if (test(element))”,它仍然可以正常工作,这让我很困惑。那么为什么程序测试的是“if (test(element))”而不是“if (test(element.living))”呢?
var SCRIPTS = [
{
name: "Adlam",
ranges: [[125184, 125259], [125264, 125274], [125278, 125280]],
direction: "rtl",
year: 1987,
living: true,
link: "https://en.wikipedia.org/wiki/Fula_alphabets#Adlam_alphabet"
},
{
name: "Caucasian Albanian",
ranges: [[66864, 66916], [66927, 66928]],
direction: "ltr",
year: 420,
living: false,
link: "https://en.wikipedia.org/wiki/Caucasian_Albanian_alphabet"
},
{
name: "Ahom",
ranges: [[71424, 71450], [71453, 71468], [71472, 71488]],
direction: "ltr",
year: 1250,
living: false,
link: "https://en.wikipedia.org/wiki/Ahom_alphabet"
},
{
name: "Arabic",
ranges: [[1536, 1541], [1542, 1548],[1568, 1600]],
direction: "rtl",
year: 400,
living: true,
link: "https://en.wikipedia.org/wiki/Arabic_script"
},
{
name: "Imperial Aramaic",
ranges: [[67648, 67670], [67671, 67680]],
direction: "rtl",
year: 800,
living: false,
link: "https://en.wikipedia.org/wiki/Aramaic_alphabet"
},
{
name: "Armenian",
ranges: [[1329, 1367], [1369, 1376], [1377, 1416],[64275, 64280]],
direction: "ltr",
year: 405,
living: true,
link: "https://en.wikipedia.org/wiki/Armenian_alphabet"
},
{
name: "Avestan",
ranges: [[68352, 68406], [68409, 68416]],
direction: "rtl",
year: 400,
living: false,
link: "https://en.wikipedia.org/wiki/Avestan_alphabet"
},
{
name: "Balinese",
ranges: [[6912, 6988], [6992, 7037]],
direction: "ltr",
year: 1000,
living: true,
link: "https://en.wikipedia.org/wiki/Balinese_script"
},
{
name: "Bamum",
ranges: [[42656, 42744], [92160, 92729]],
direction: "ltr",
year: 1896,
living: true,
link: "https://en.wikipedia.org/wiki/Bamum_script"
},
{
name: "Bassa Vah",
ranges: [[92880, 92910], [92912, 92918]],
direction: "ltr",
year: 1950,
living: false,
link: "https://en.wikipedia.org/wiki/Bassa_alphabet"
},
{
name: "Batak",
ranges: [[7104, 7156], [7164, 7168]],
direction: "ltr",
year: 1300,
living: true,
link: "https://en.wikipedia.org/wiki/Batak_alphabet"
},
{
name: "Bengali",
ranges: [[2432, 2436], [2437, 2445], [2447, 2449], [2451, 2473],[2492, 2501]],
direction: "ltr",
year: 1050,
living: true,
link: "https://en.wikipedia.org/wiki/Bengali_alphabet"
}
]
function filter(array, test) {
let passed = [];
for (let element of array) {
if (test(element)) {
passed.push(element);
}
}
return passed;
}
console.log(filter(SCRIPTS, function(element) {return element.living}));
解决方案
它之所以起作用,是因为在filter
,test
是这个函数(它接收它作为test
参数的值):
function(element) {return element.living}
...返回living
传入元素的属性。
这意味着
if (test(element)) {
passed.push(element);
}
有效地
if (element.living) {
passed.push(element);
}
因为test
所做的只是返回属性的值。
推荐阅读
- python - Pandas - 创建列,其中包含其他两列中存在的开始和结束年份之间的所有年份的列表
- r - R:创建具有节点属性的“statnet”网络
- mysql - 将 Oracle DB 数据迁移到 Mysql db
- python - 对形状不一致的数据执行 UMAP 降维 - python
- java - 使用简单 JSON 发布数据 - 收到错误 - UnsupportedMediaTypeError:
jsonParser 上不支持的字符集“ISO-8859-1” - mysql - 忘记 Mysql 密码 - 无法更改
- java - R 包中的 Checker 函数,用于查找客户端计算机中安装的 JDK 版本
- spring - [hive][redis] 引起:java.lang.NoSuchMethodError: io.netty.util.ResourceLeakDetector.addExclusions
- azure-function-app - 功能在本地运行,而不是在部署到 Azure 时运行
- javascript - 在生产中无法从 Express 获得 JSON 响应