Найти массив и объект отношения - PullRequest
0 голосов
/ 04 августа 2020
let data = [{
    name: "Sarah",
    year: ["1924", "1936", "1948", "1960", "1972", "1984", "1996", "2008", "2020", "2032"]
  },
  {
    name: "Ann",
    year: ["1925", "1937", "1949", "1961", "1973", "1985", "1997", "2009", "2021", "2033"]
  }
];

мы назначаем массив, и внутри массива есть два объекта, и каждый объект имеет другой массив.

Я хочу спросить у пользователя год его рождения и выбрать ее имя из значения объекта из имени.

например, если она родилась в 1949 году, ее имя должно быть Энн, или если она родилась в 1960 году, ее имя должно быть Сара.

Я думаю о двух днях, но не могу решите эту проблему.

Я не хочу писать код if / else или case переключает состояние. есть ли другой вариант кода? Я хочу сопоставить имя и возраст.

Надеюсь, я хорошо объясню ...

Ответы [ 4 ]

2 голосов
/ 04 августа 2020

Думаю, это то, что вы ищете

let data = [{
  name: "Sarah",
  year: ["1924", "1936", "1948", "1960", "1972", "1984", "1996", "2008", "2020", "2032"]
}, {
  name: "Ann",
  year: ["1925", "1937", "1949", "1961", "1973", "1985", "1997", "2009", "2021", "2033"]
}];

function yearToName(year) {
  return data.find(x => x.year.includes(year)).name;
}

console.log(yearToName("1936"))
console.log(yearToName("1937"))
1 голос
/ 04 августа 2020

Вы можете выполнить sh это, используя Array.find и Array.includes : найдите запись, годы которой включают то, что вы ищете, а затем вытащите из нее имя . Примерно так:

function getName (searchYear) {
  const entry = data.find(({year}) => year.includes[searchYear]);
  return entry?.name;
}
0 голосов
/ 04 августа 2020

Вы можете написать функцию, которая получит имя

С помощью этих методов

  1. Array.find - чтобы получить единственный объект из массива объекты
  2. Array.includes - найти прошедший год, присутствующий в массиве года
  3. ? - Необязательная цепочка, чтобы получить ошибку , он вернет undefined или null
  4. ?? - Nulli sh оператор объединения, чтобы вернуть правую часть, когда левая сторона имеет значение NULL или undefined

let data = [{
  name: "Sarah",
  year: ["1924", "1936", "1948", "1960", "1972", "1984", "1996", "2008", "2020", "2032"]
}, {
  name: "Ann",
  year: ["1925", "1937", "1949", "1961", "1973", "1985", "1997", "2009", "2021", "2033"]
}];

const getTheName = (year) => data.find(datumn => datumn.year.includes(year))?.name ?? `Don't have a name`

console.log(getTheName('1924')) // Sarah
console.log(getTheName('1949')) // Ann
console.log(getTheName('2020')) //Don't have a name
0 голосов
/ 04 августа 2020

Возможно, это не совсем то, что вам нужно, но, установив структуру поиска, вы можете ускорить и упростить последующие шаги поиска. Он будет вести себя стабильно, то есть в течение многих лет, когда имя не было определено, будет возвращено "undefined".

let data = [ 
     {name:"Sarah",
      year:["1924", "1936", "1948", "1960", "1972", "1984", "1996", "2008", "2020", "2032"]},
     {name:"Ann", 
      year:["1925", "1937", "1949", "1961", "1973", "1985", "1997", "2009", "2021", "2033"]}
    ];

// setup a looup structure:
data.lookup=data.reduce((a,{name,year})=>(year.forEach(y=>a[y]=name),a),{})

// run a test over many years:
for (let y=1923;y<2034;y++) data.lookup[y] && console.log(y,data.lookup[y]);
...