Как разбить и искать из массива? - PullRequest
2 голосов
/ 08 февраля 2020

Я пытаюсь найти имя из телефонной книги и распечатать результат (name: number).

Мое разрешение - разделить предварительно определенный массив phonebook и найти предварительно определенное имя name из нового массива я получаю. Искомое имя должно быть сохранено в предварительно определенном para2 с номером.

Я не могу внести какие-либо изменения в код до //Ad your code here -tag. Если я не использую .toString с разделением, я получаю ошибку. Если я его использую, код ничего не возвращает.

Я предполагаю, что моя проблема как-то связана с содержимым строки / массива, но не может решить эту проблему.

// Don't change this
let name = 'Mustafa';
let para2 = document.createElement('p');

let phonebook = [
  { name : 'Anne', number : '9065' },
  { name : 'Mustafa', number : '6888' },
  { name : 'Tina', number : '4312' },
]

// Add your code here
i = 0;
do {
  let splitContact = phonebook[i].toString().split('name : ', ', number : ');
  let nameListed = splitContact[0]
  let numberListed = splitContact[1]
  if (nameListed === name) {
    para2.textContent = nameListed.textContent + ': ' + numberListed.textContent;
    break;
  } else {
    para2.textContent = 'Contact not found.';
  }
  i++;
} while (i < phonebook.length);

Ответы [ 4 ]

0 голосов
/ 08 февраля 2020

Вы можете использовать Array.find , чтобы сделать это

// Don't change this
let name = 'Mustafa';
let para2 = document.createElement('p');

let phonebook = [
  { name : 'Anne', number : '9065' },
  { name : 'Mustafa', number : '6888' },
  { name : 'Tina', number : '4312' },
]

let foundNumber = phonebook.find((phonebookEntry) => phonebookEntry.name === name)
if (foundNumber) {
    para2.textContent = `${foundNumber.name}: ${foundNumber.number}`;
} else {
    para2.textContent = 'Contact not found.';
}
0 голосов
/ 08 февраля 2020

Нет необходимости использовать .toString() на ваших объектах. В данный момент вы перебираете массив, используя do-while l oop. Это может быть изменено на while l oop, так как вы знаете, что вам нужно будет выполнить итерацию по крайней мере до конца вашего массива, однако вы можете прекратить зацикливание раньше, если найдете свой объект. Используя while l oop, вы можете l oop по каждому объекту в вашем массиве, чтобы определить, имеет ли объект свойство .name, равное имени поиска. Вы можете остановить l oop, как только ваш объект будет найден:

// Don't change this
let name = 'Mustafa';
  
let phonebook = [
  { name : 'Anne', number : '9065' },
  { name : 'Mustafa', number : '6888' },
  { name : 'Tina', number : '4312' },
];

let found = false;
let i = 0;
while(i < phonebook.length && !found) {
  const currentPerson = phonebook[i]; // get current object from phonebook
  if(currentPerson.name === name) { // use dot notation on the object, get it's name, and see if it equals the search name
    console.log(name +": " +currentPerson.number);
    found = true; // stop the loop
  } 
  i++;
}
// by this point we have looped through the entire array
if(!found) { // if found is still false, then the contact hasn't been found
  console.log("Contact not found.");
}

Вышесказанное также можно выполнить с помощью функций высшего порядка, таких как .find() в массиве phonebook, который позаботится об этом logi c для вас:

// Don't change this
let name = 'Mustafa';
  
let phonebook = [
  { name : 'Anne', number : '9065' },
  { name : 'Mustafa', number : '6888' },
  { name : 'Tina', number : '4312' },
];

const person = phonebook.find(o => o.name === name);

if(person) {
  console.log(person.name +": " +person.number);
} else {
  console.log("Contact not found.");
}

Метод find принимает функцию, эта функция вызывается для каждого элемента в вашем массиве. Если он возвращает true для данного элемента в вашем массиве, метод .find() вернет этот элемент.

0 голосов
/ 08 февраля 2020

Без особого контекста вопроса, мне интересно, будет ли работать find в массиве?

phonebook.find(x => x.name === name);

Это либо вернет найденное значение, или undefined.

0 голосов
/ 08 февраля 2020

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

Вам не нужно ничего разбивать. Вот минимальное изменение в вашем коде, которое должно дать вам то, что вы выбираете

// Don't change this
let name = 'Mustafa';
let para2 = document.createElement('p');

let phonebook = [
  { name : 'Anne', number : '9065' },
  { name : 'Mustafa', number : '6888' },
  { name : 'Tina', number : '4312' },
]

// Add your code here
i = 0;
do {

  let nameListed =  phonebook[i].name
  let numberListed = phonebook[i].number
  if (nameListed === name) {
    para2.textContent = nameListed.textContent + ': ' + numberListed.textContent;
    break;
  } else {
    para2.textContent = 'Contact not found.';
  }
  i++;
} while (i < phonebook.length);
...