对象

时间:2018-06-05 05:21:22

标签: ecmascript-6 parameter-passing

我试图通过传递一些对象值作为rest参数来提取用户信息。每当我尝试传递2个参数时,代码都会抛出错误(未定义)。我错过了什么?

以下是我要做的Jsfiddle链接。

let userAddress = [{
  "street": "someStreet1",
  "house": "1",
  "person": "User1"
}, {
  "street": "someStreet2",
  "house": "2",
  "person": "User2"
}, {
  "street": "someStreet3",
  "house": "3",
  "person": "User3"
}];

let userInfo = [];

let addressToCheck = (...newUserHouse) => {
  for (let address of userAddress) {
    if (newUserHouse == address.house) {
      userInfo.push(address.person);
      console.log(userInfo);
    }
  }
}

console.log(addressToCheck(3, 2));

修改

其他信息:

我遇到了这个问题,我有一个JSON数据,我必须传递多个值并检查这些值是否存在于数据集中,如果存在,则显示整个对象。

例如;在userAddress数组中(如上所示),我需要检查32(作为参数传递)是否在house中作为userAddress数字出现。如果它们存在,则显示有关该特定对象的全部信息。在这种情况下,由于32是有效的门牌号,因此预期结果应为:

Object { "street": "someStreet2", "house": "2", "person": "User2" }  
Object { "street": "someStreet3", "house": "3", "person": "User3" } 

3 个答案:

答案 0 :(得分:2)

代码不会抛出undefined错误,只是记录undefined。这是因为您在console.log的返回值上调用addressToCheck但该函数没有返回值,因此它隐式返回undefined。请参阅console.log returns an additional undefined

但是,您的代码存在更多问题。它只是在您传递单个参数时意外工作,因为您使用的是松散比较(==)。

rest参数的值始终为数组。这意味着您正在进行以下比较:

[1, 2] == "1"
[1, 2] == "2"
[1, 2] == "3"

我希望很明显为什么这不起作用。具有多个元素的数组不能等于单个"元素",因此永远不会满足if条件。

使用单个参数意外地工作,因为[1]的字符串表示只是"1"。如果[1,2]"1,2",则字符串表示。

您没有解释所需的结果是什么,但如果您想为所提供的输入选择所有地址,则应使用.filter。您可以将提供的参数转换为快速查找的集合。

而不是将值分配给"外部"数组,只需返回函数的结果。



let userAddress = [{
  "street": "someStreet1",
  "house": "1",
  "person": "User1"
}, {
  "street": "someStreet2",
  "house": "2",
  "person": "User2"
}, {
  "street": "someStreet3",
  "house": "3",
  "person": "User3"
}];

let addressToCheck = (...newUserHouse) => {
  newUserHouse = new Set(newUserHouse);
  return userAddress.filter(address => newUserHouse.has(address.house));
};

console.log(addressToCheck("3", "2"));




答案 1 :(得分:0)

在我的代码中,我错过了其余参数是参数数组这一点,为了操纵它们,我们也必须迭代它们。

let userAddress = [{
  "street": "someStreet1",
  "house": 1,
  "person": "User1"
}, {
  "street": "someStreet2",
  "house": 2,
  "person": "User2"
}, {
  "street": "someStreet3",
  "house": 3,
  "person": "User3"
}]


let addressToCheck = (...houses) => {
	for(let house of houses){
  	for (let user of userAddress) {
    	if(user.house === house){
      	console.log(user);
        break;
      }
  	}
  }
}

console.log(addressToCheck(1, 3));

答案 2 :(得分:0)

使用ES6实现此目的的一种功能方法是在自定义函数(即getUsersMatchingHouseNumbers)中使用数组的filter()includes()方法,如下面的要点:



const userData = [{
  "street": "someStreet1",
  "house": 1,
  "person": "User1"
}, {
  "street": "someStreet2",
  "house": 2,
  "person": "User2"
}, {
  "street": "someStreet3",
  "house": 3,
  "person": "User3"
}]


function getUsersMatchingHouseNumbers(userData, ...houseNumbers) {
  return userData.filter(({ house }) => houseNumbers.includes(house));
}

console.log(getUsersMatchingHouseNumbers(userData, 1, 3));




备注

  1. userData.filter(({ house })部分使用Object destructuring仅从每个house对象中获取userData属性/值。

  2. getUsersMatchingHouseNumbers函数返回一个用户对象数组,其house数字与调用时传递给函数的数字相匹配。