所以我有24个“人”对象,我用“名字”数组创建,所以“花花公子”的名字在重复; 接下来,我创建了一个函数,将一些随机数与对象id-s进行比较,如果它们相等,那么我正在尝试使用该id创建新的人名数组。
(如果这听起来太复杂,我很抱歉,但我真的不明白为什么我的地图方法不起作用。)
这里有两个版本的代码。 第一个可行,并按我的意愿行事。
var names = ["jim", "jack", "aaron", "hugh", "jeff", "cameron", "allen", "charlie"];
var len = 3,
arr1 = [],
counter = 1;
for (var i = 0; i < len; i++) {
names.forEach(name => {
arr1.push({
id: counter,
dude: name
});
counter++;
});
}
console.log(arr1);
function checkName(nums) {
var namesarr = [];
for (var i = 0; i < arr1.length; i++) {
nums.forEach(function(num) {
if (num === arr1[i].id) {
namesarr.push(arr1[i].dude);
}
});
}
return (namesarr);
};
console.log(checkName([1, 3, 6]));
但在第二个版本中,我的地图函数返回undefined,,我真的不明白为什么?!
var names = ["jim", "jack", "aaron", "hugh", "jeff", "cameron", "allen", "charlie"];
var len = 3,
arr1 = [],
counter = 1;
for (var i = 0; i < len; i++) {
names.forEach(name => {
arr1.push({
id: counter,
dude: name
});
counter++;
});
}
console.log(arr1);
function checkName(nums) {
var namesarr;
for (var i = 0; i < arr1.length; i++) {
namesarr = nums.map(function(num) {
if (num === arr1[i].id) {
return arr1[i].dude;
}
});
}
return (namesarr);
};
console.log(checkName([1, 3, 6]));
答案 0 :(得分:0)
您在循环的每次迭代中覆盖namesarr
变量。我认为你打算在每次传球时添加它,而不是覆盖它。为此,您可以使用数组.concat
方法。
然后,最后,确保在返回结果之前过滤掉结果中的所有undefined
值。
var names = ["jim", "jack", "aaron", "hugh", "jeff", "cameron", "allen", "charlie"];
var len = 3,
arr1 = [],
counter = 1;
for (var i = 0; i < len; i++) {
names.forEach(name => {
arr1.push({
id: counter,
dude: name
});
counter++;
});
}
console.log(arr1);
function checkName(nums) {
var namesarr = [];
for (var i = 0; i < arr1.length; i++) {
namesarr = namesarr.concat(nums.map(function(num) {
if(num === arr1[i].id) {
return arr1[i].dude;
}
}));
}
return (namesarr.filter(Boolean));
};
console.log(checkName([1,3,6]));
答案 1 :(得分:0)
map()
的结果是所有返回值的数组。如果某个函数没有执行return
语句,则相当于以return undefined
结尾。
在您的第二个版本中,只要if
条件失败,您就不会执行return arr1[i].dude;
,因此默认情况下它会返回undefined
。它好像你写的那样:
namesarr = nums.map(function(num) {
if (num === arr1[i].id) {
return arr1[i].dude;
} else {
return undefined;
}
});
您的两个版本的代码之间的另一个区别是第二个版本每次通过namesarr
循环重新分配for
。所以你只是打印最后一次迭代的结果。
第一个版本在循环之前将其赋值一次,并且仅在if
条件成功时才添加它,因此您可以从所有迭代中获取元素。
答案 2 :(得分:0)
您的map
函数没有为数组中的所有项返回内容(因为if
),因此结果数组中的某些值将为undefined
。< / p>
另外,您的map
位于循环遍历arr1
的循环内,因此对于该循环的每次迭代,数组namesarr
都会被覆盖。因此,map
就好像它只应用于arr1
中的最后一个元素一样,因此如果nums
包含N
个元素,那么namesarr
将至少包含N - 1
其中undefined
N - 1
值(arr1
如果nums
的最后一个对象与N
匹配,map
则匹配function checkName(nums) {
return arr1.reduce(function(namesarr, obj) { // for each object obj in the array arr1
if(nums.indexOf(obj.id) !== -1) { // if the object's id is in the array nums
namesarr.push(obj.dude); // then add the object's dude to the array namesarr
}
return namesarr;
}, []); // the empty array to initialize namesarr
}
。
使用reduce
代替string telephone = child.Properties["telephoneNumber"].Value.ToString();
string name = child.Properties["cn"].Value.ToString();
:
whenCreated