I would like to return primaryNumber
without having to use a an extra variable for it.
I would like an arrow statement function that just returns element.number
without needing primaryNumber
. As it stands the inner forEach is in a different scope so I can't just return element.number
from findPrimaryNumber()
. Is there a good solution?
function findPrimaryNumber(gender, naturalExpressionYearOfBirth) {
let primaryNumber, primaryNumberGenderObject;
if (gender === "f") {
primaryNumberGenderObject = primaryNumberFemales;
} else if (gender === "m") {
primaryNumberGenderObject = primaryNumberMales;
}
primaryNumberGenderObject.forEach(element => {
element.year.forEach(yearWeAreLookingFor => {
if (yearWeAreLookingFor === naturalExpressionYearOfBirth) {
primaryNumber = element.number;
}
});
});
return primaryNumber;
}
Here is an example of the object it is searching:
const primaryNumberMales = [{
name: "Fire Yin",
number: 9,
year: [1910,
1919,
1928,
1937,
1946,
1955,
1964,
1973,
1982,
1991,
2000,
2009,
2018
]
},
{
name: "Mountain Yang",
number: 8,
year: [1911,
1920,
1929,
1938,
1947,
1956,
1965,
1974,
1983,
1992,
2001,
2010,
2019,
]
},
{
name: "Lake Yin",
number: 7,
year: [1912,
1921,
1930,
1939,
1948,
1957,
1966,
1975,
1984,
1993,
2002,
2011,
2020,
]
},
{
name: "Sky Yang",
number: 6,
year: [1913,
1922,
1931,
1940,
1949,
1958,
1967,
1976,
1985,
1994,
2003,
2012,
2021,
]
},
{
name: "Earth Core Yang",
number: 5,
year: [1914,
1923,
1932,
1941,
1950,
1959,
1968,
1977,
1986,
1995,
2004,
2013,
2022,
]
},
{
name: "Wind Yin",
number: 4,
year: [1915,
1924,
1933,
1942,
1951,
1960,
1969,
1978,
1987,
1996,
2005,
2014,
2023,
]
},
{
name: "Thunder Yang",
number: 3,
year: [1916,
1925,
1934,
1943,
1952,
1961,
1970,
1979,
1988,
1997,
2006,
2015,
2024,
]
},
{
name: "Earth Yin",
number: 2,
year: [1917,
1926,
1935,
1944,
1953,
1962,
1971,
1980,
1989,
1998,
2007,
2016,
2025,
]
},
{
name: "Sea Yang",
number: 1,
year: [1918,
1927,
1936,
1945,
1954,
1963,
1972,
1981,
1990,
1999,
2008,
2017,
2026,
]
}
];
You can use find:
primaryNumberGenderObject.find(element => {
return element.year.includes(naturalExpressionYearOfBirth)
}).number;
This will find the first element where the callback return true
.
You can try this by using .find
function findPrimaryNumber(gender, naturalExpressionYearOfBirth) {
let primaryNumberGenderObject;
if (gender === "f") {
primaryNumberGenderObject = primaryNumberFemales;
} else if (gender === "m") {
primaryNumberGenderObject = primaryNumberMales;
}
return (primaryNumberGenderObject.find(element =>
element.year.includes(naturalExpressionYearOfBirth)
) || {}).number
// OR AN INNER FIND, NOT SO ADVISABLE
// return (primaryNumberGenderObject.find(element =>
// element.year.find(yearWeAreLookingFor =>
// yearWeAreLookingFor === naturalExpressionYearOfBirth
// )
// ) || {}).number
}
Use for-loop
, your function will become way simpler and readable, because you will be able to return from the inner loop:
function findPrimaryNumber(gender, naturalExpressionYearOfBirth) {
let primaryNumber, primaryNumberGenderObject;
if (gender === "f") {
primaryNumberGenderObject = primaryNumberFemales;
} else if (gender === "m") {
primaryNumberGenderObject = primaryNumberMales;
}
for (let element of primaryNumberGenderObject) {
for (let yearWeAreLookingFor of element.year) {
if (yearWeAreLookingFor === naturalExpressionYearOfBirth) {
return element.number;
}
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.