Próbuję wyciągnąć informacje o użytkowniku, przekazując niektóre wartości obiektu jako parametr odpoczynku. Ilekroć próbuję przekazać 2 argumenty, kod rzuca błąd (niezdefiniowany). Co mi brakuje?

Oto JSFiddle link z tego, co próbuję zrobić.

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));

EDYTUJ

Dodatkowe informacje:

Miałem ten problem, w którym miałem dane JSON i musiałem przekazać wiele wartości i sprawdzić, czy te wartości były obecne w zestawie danych, czy nie i jeśli są obecne, wyświetlić cały obiekt.

Na przykład; W tablicy userAddress (jak pokazano powyżej), muszę sprawdzić, czy 3, 2 (przekazany jako argument) są obecne jako house w userAddress . Jeśli są obecne, a następnie wyświetlaj całe informacje o tym konkretnym obiekcie. Jak w tym przypadku, ponieważ 3 2 są prawidłowymi numerami domów, oczekiwany wynik powinien być:

Object { "street": "someStreet2", "house": "2", "person": "User2" }  
Object { "street": "someStreet3", "house": "3", "person": "User3" } 
0
Abhinav Alok 5 czerwiec 2018, 08:21

3 odpowiedzi

Najlepsza odpowiedź

Funkcjonalny sposób osiągnięcia tego za pomocą ES6 jest wykorzystanie tablicy filter() i {X1}} metody w funkcji niestandardowej, (mianowicie getUsersMatchingHouseNumbers), jak pokazano na poniższym wyborze:

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));

Notatki

  1. Część userData.filter(({ house }) część używa Obiekt Destrucructing, aby uzyskać tylko właściwość /}} właściwość / wartość z każdego obiektu userData.

  2. Funkcja getUsersMatchingHouseNumbers zwraca tablicę obiektów użytkowników, których numer house pasuje do tych przekazywanych do funkcji, gdy zostanie wywołany.

0
RobC 6 czerwiec 2018, 13:00

Kod nie rzuca błąd undefined, po prostu dzienniki wartość undefined. I tak się dzieje, ponieważ dzwonisz console.log na wartości zwracanej addressToCheck, ale funkcja nie zwraca wartości, więc niejawnie powraca undefined. Zobacz Console.log zwraca dodatkowe niezdefiniowane.


Jednak istnieje więcej problemów z kodem. Przypadkowo działa tylko po przejściu pojedynczego argumentu, ponieważ używasz luźnych porównania (==).

Wartość parametru odpoczynku jest zawsze tablarek . Oznacza to, że naprawdę robisz następujące porównania:

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

Mam nadzieję, że to oczywiste, dlaczego nie może to pracować. Tablica z wieloma elementami nie może być równa pojedynczy "element", więc warunek if nigdy nie jest spełniony.

Działa przypadkowo z jednym argumentem, ponieważ reprezentacja ciągu [1] jest po prostu "1". Reprezentacja ciągu, jeśli [1,2] jest jednak "1,2".

Nie wyjaśniasz, jaki jest pożądany wynik, ale jeśli chcesz wybrać wszystkie adresy dla podanego wejścia, zamiast tego należy używać .filter. I możesz konwertować podane argumenty do zestawu do szybkiego wyszukiwania.

Zamiast przypisać wartości do "zewnętrznej" tablicy, po prostu zwróć wynik z funkcji.

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"));
2
Felix Kling 5 czerwiec 2018, 06:25

W moim kodzie, brakowało mi, że parametry odpoczynku są macierz parametrów i w celu manipulowania ich, musimy też iterować nad nimi.

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
Abhinav Alok 6 czerwiec 2018, 06:07