我试图通过传递一些对象值作为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
数组中(如上所示),我需要检查3
,2
(作为参数传递)是否在house
中作为userAddress
数字出现。如果它们存在,则显示有关该特定对象的全部信息。在这种情况下,由于3
,2
是有效的门牌号,因此预期结果应为:
Object { "street": "someStreet2", "house": "2", "person": "User2" }
Object { "street": "someStreet3", "house": "3", "person": "User3" }
答案 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));

备注强>
userData.filter(({ house })
部分使用Object destructuring仅从每个house
对象中获取userData
属性/值。
getUsersMatchingHouseNumbers
函数返回一个用户对象数组,其house
数字与调用时传递给函数的数字相匹配。