【问题标题】:How to split and search from array?如何从数组中拆分和搜索?
【发布时间】:2020-02-08 12:31:27
【问题描述】:

我正在尝试从电话簿中搜索姓名并将结果打印出来 (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);

【问题讨论】:

  • 你不能对一个对象使用 split

标签: javascript split tostring


【解决方案1】:

无需在您的对象上使用.toString()。目前,您正在使用 do-while 循环遍历数组。这可以更改为 while 循环,因为您知道至少需要迭代到数组的末尾,但是,如果您找到对象,您可能会提前停止循环。使用while 循环,您可以遍历数组中的每个对象,以查找该对象是否具有等于搜索名称的.name 属性。找到对象后,您可以停止循环:

// 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 数组上,它会为您处理此逻辑:

// 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() 方法将返回该元素。

【讨论】:

  • 非常感谢!这有效(我不得不使用 while 版本)。我刚刚开始,并没有意识到“名称:”和“号码:”不是实际字符串的一部分......
  • @tHelene 不用担心。是的,对象本身具有namenumber 属性,这是使用对象的优点,它们允许您通过本质上给它一个“名称”来存储信息
【解决方案2】:

在没有太多上下文的情况下,我想知道阵列上的 find 是否可以完成这项工作?

phonebook.find(x =&gt; x.name === name);

这将返回找到的值或undefined

【讨论】:

    【解决方案3】:

    您可以使用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.';
    }
    

    【讨论】:

      【解决方案4】:

      您只需要访问作为对象的数组元素并插入在您的情况下为名称和数字的属性。

      你不需要拆分任何东西。 这是对您的代码的最小更改,它应该为您提供您选择的内容

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

      【讨论】:

        猜你喜欢
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        相关资源
        最近更新 更多