首页 > 解决方案 > 检查对象数组范围内的日期

问题描述

我正在尝试创建一个函数,该函数接受一个数组并搜索以查看员工是否在 1990 年之后被雇用。如果他们是,该函数会将他们的名字推送到一个新数组。我正在处理年龄范围,所以我有点被过滤绊倒了。通过将密钥对中的前 4 个值复制到第三个比较数组,我想出了一个非常狡猾的方法。我的代码似乎按预期工作,但抛出随机错误消息,我不知道如何调试它。是否有更有效的方法来完成不会导致错误消息的相同结果?

const employeeList = [{
    "id": 0,
    "name": "Employee 1",
    "years": "1991 - 1993",
    "nationality": "Asian"
  },
  {
    "id": 1,
    "name": "Employee 2",
    "years": "1988 - 2020",
    "nationality": "Hispanic"
  },
  {
    "id": 2,
    "name": "Employee 3",
    "years": "1990 - 2010",
    "nationality": "Pacific Islander"
  },
  {
    "id": 3,
    "name": "Employee 4",
    "years": "1971 - 1999",
    "nationality": "Asian"
  }
]

function getEmployees(array) {
  let newArray = new Array();
  let compareArray = new Array();
  for (var i = 0, len = array.length; i < len; i++) {
    compareArray.push((array[i].years).substr(0, 4));
  }
  console.log(compareArray)
  for (var j = 0; j < compareArray.length; j++) {
    console.log(compareArray[j])
    console.log(array[j].name)
    if (compareArray[j] > 1990) {
      newArray.push.call(array[j].name);
    }
  }
  return (newArray);
}

getEmployees(employeeList);

标签: javascriptarrays

解决方案


您的问题在于您对.call(). 第一个参数.call()指定this您正在使用的方法的绑定.call()。在这种情况下,您将 this 设置为您的 string array[j].name。运行时.push(),它将尝试更新您要推送到的数组的.length属性(因此this是 .length 属性)。当您将 设置this为字符串时,当 .push() 尝试更新.length字符串的属性时,它将引发错误,因为.length字符串的属性是只读的,这意味着您无法为其分配新值。

相反,您希望this引用您的新数组,而不是您的字符串。相反,您可以使用:

.call(newArray, array[j].name)

或者,只需使用:

newArray.push(array[j].name);

const employeeList = [{
    "id": 0,
    "name": "Employee 1",
    "years": "1991 - 1993",
    "nationality": "Asian"
  },
  {
    "id": 1,
    "name": "Employee 2",
    "years": "1988 - 2020",
    "nationality": "Hispanic"
  },
  {
    "id": 2,
    "name": "Employee 3",
    "years": "1990 - 2010",
    "nationality": "Pacific Islander"
  },
  {
    "id": 3,
    "name": "Employee 4",
    "years": "1971 - 1999",
    "nationality": "Asian"
  }
]

function getEmployees(array) {
  let newArray = [];
  let compareArray = [];
  for (var i = 0, len = array.length; i < len; i++) {
    compareArray.push(+(array[i].years).substr(0, 4));
  }
  for (var j = 0; j < compareArray.length; j++) {
    if (compareArray[j] > 1990) {
      newArray.push(array[j].name); // change to just `.push()` rather than `.call()`
    }
  }
  return newArray;
}

console.log(getEmployees(employeeList));


推荐阅读