javascript - 为什么过滤器函数在 Javascript 中不返回正确的值
问题描述
我是 Javascript 新手,因此以下错误可能来自新手。
我有下面的复杂对象,根据 first 的值array
,我想select
从“对象数组”中填充一个选项。从filter
函数返回的值不是我所期望的,所以我请求你的帮助。
var complexObject = {
itemList: ["Item1", "Item1", "Item1", "Item1", "Item2", "Item2"],
itemDetails: [{
itemList: "List1",
itemType: "Type1"
},
{
itemList: "List2",
itemType: "Type2"
},
{
itemList: "List3",
itemType: "Type3"
},
{
itemList: "List4",
itemType: "Type4"
},
{
itemList: "ListH",
itemType: "TypeH",
},
{
itemList: "ListZ",
itemType: "TypeZ",
}
]
};
function populateItems() {
var itemListArray = complexObject.itemList.slice();
var itemCount = itemListArray.length;
var i = 0;
while (i < itemCount) {
if (itemListArray[i] == itemListArray[i + 1]) {
itemListArray.splice(i, 1);
} else
i++;
itemCount = itemListArray.length;
}
var option1List = document.getElementById("option1");
for (i = 0; i < itemListArray.length; i++) {
var newOption = new Option(itemListArray[i]);
option1List.add(newOption);
}
}
function changeOption2() {
var selectedOption = document.getElementById("option1").value;
var selectedType = complexObject.itemList.filter(function(value, index) {
if (value == selectedOption)
return (complexObject.itemDetails[index].itemType);
});
var option2List = document.getElementById("option2");
var i = 1;
while (i < option2List.length)
option2List.remove(i);
option2List = document.getElementById("option2");
for (i = 0; i < selectedType.length; i++) {
var newOption = new Option(selectedType[i]);
option2List.add(newOption);
}
}
<body onload="populateItems()">
<p>Option 1:</p>
<select id="option1" onchange="changeOption2()">
<option>Select</option>
</select>
<br><br>
<p>Option2:</p>
<select id="option2">
<option>Select</option>
</select>
<body>
感谢您的时间和耐心。
解决方案
请参阅过滤器文档。
您必须在过滤器回调中返回一个布尔值。如果函数返回 false,它将过滤掉数组的元素,如果返回 true,则保留它。由于您返回的不是布尔值而是字符串,因此它将返回 true,因为 javascript 将非 null 或非未定义值视为true
.
您可能想改用Array.reduce()。
尝试这个:
var selectedType=complexObject.itemList.reduce(function(accumulator, value, index) {
if (value==selectedOption) accumulator.push(complexObject.itemDetails[index].itemType);
return accumulator;
}
, []);
推荐阅读
- tcp - EG getting restarted when ESB tries to fetch data from an external system over TCPIP connection for more than 59 times
- java - 需要使用正则表达式检查通配符
- php - MYSQL 两张表,每个用户在块内显示
- spring-boot - 如何将一个表中的实体链接到另一个表中?
- javascript - How to use thumbnail slick carousel in Vue.JS
- php - 在大文件上传中批量处理数据时如何避免 PHP/WordPress 内存致命错误?
- amazon-web-services - AWS RDS:虽然安全组对我的 ip 或 All 具有入站权限,但无法从我的本地访问
- c# - Assets/sucriptusu/movement/onflor.cs(23,13): error CS0120: An object reference is required for the non-static field, method, or property 'zoom.upZoom'
- python - Python: Trying to approximate 'portion_saved' in the following code
- arrays - How to unwind two arrays in Mongodb and project them distinctly?