Javascript,map返回undefined

时间:2017-12-01 00:10:26

标签: javascript arrays object dictionary

所以我有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]));

3 个答案:

答案 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