Использование параметра отдыха с объектом - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь получить информацию о пользователе, передавая некоторые значения объекта в качестве параметра 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" } 

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

В моем коде я упустил момент, когда остальные параметры являются массивом параметров , и для того, чтобы манипулировать ими, мы должны выполнить итерации по ним.

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));
0 голосов
/ 06 июня 2018

Функциональным способом достижения этого с помощью ES6 является использование методов filter() и includes() массива в пользовательской функции (а именно getUsersMatchingHouseNumbers), как показанов сущности ниже:

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 }) используется Разрушение объекта для получениятолько house свойство / значение из каждого userData объекта.

  2. Функция getUsersMatchingHouseNumbers возвращает массив пользовательских объектов, чей номер house соответствует объектам, переданным в функцию, когдаоно вызывается.

0 голосов
/ 05 июня 2018

Код не выдает ошибку undefined, он просто регистрирует значение undefined.И это происходит потому, что вы вызываете console.log для возвращаемого значения addressToCheck, но функция не возвращает значение, поэтому она неявно возвращает undefined.См. console.log возвращает дополнительный неопределенный .


Однако в вашем коде больше проблем.Это только случайно работает, когда вы передаете один аргумент, потому что вы используете свободное сравнение (==).

Значением параметра rest всегда является array .Это означает, что вы действительно проводите следующие сравнения:

[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"));
...