简体   繁体   中英

How can I return a value from the main function when using a nested forEach loop without a temporary variable?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM