Проблема с заявлениями If и Return

1

Может ли кто-нибудь сказать мне, где моя ошибка? Я знаю, что это имеет какое-то отношение к тому, где мои операторы if относятся к циклу, но я не могу на него наложить. Цель состоит в том, чтобы проверить функцию, если объект имеет определенное свойство, а затем вернуть свойство. Спасибо!

//Setup
var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];


function lookUpProfile(firstName, prop) {
// Only change code below this line
 for (var i = 0; i < contacts.length; i++) {

    if (contacts[i].firstName === firstName) {
     if (contacts[i].hasOwnProperty(prop)) {
       return contacts[i][prop];
     }   
   } 

   else if (firstName !== contacts[i].firstName) {
     return "No such contact";
   }

   return "No such property";
 } 




// Only change code above this line
}

// Change these values to test your function
lookUpProfile("Kristian", "lastName");
  • 3
    Проблема в том, что вы проверяете только i = 0 и сразу возвращаетесь. Ваш отказ для No such contact и No such property должны быть размещены таким образом, чтобы он мог проверить каждый индекс.
  • 0
    Вы говорите, if (x === y) а затем позже, if (y !== x) что не имеет смысла. Вторая ветвь является логической инверсией первой.
Показать ещё 1 комментарий
Теги:

4 ответа

2

Как я уже сказал в комментариях, вам нужно переместить условия сбоя, чтобы цикл for смог проверить необходимые индексы перед возвратом:

var contacts = [{
    "firstName": "Akira",
    "lastName": "Laine",
    "number": "0543236543",
    "likes": ["Pizza", "Coding", "Brownie Points"]
  },
  {
    "firstName": "Harry",
    "lastName": "Potter",
    "number": "0994372684",
    "likes": ["Hogwarts", "Magic", "Hagrid"]
  },
  {
    "firstName": "Sherlock",
    "lastName": "Holmes",
    "number": "0487345643",
    "likes": ["Intriguing Cases", "Violin"]
  },
  {
    "firstName": "Kristian",
    "lastName": "Vos",
    "number": "unknown",
    "likes": ["Javascript", "Gaming", "Foxes"]
  }
];

function lookUpProfile(firstName, prop) {
  for (var i = 0; i < contacts.length; i++) {
    if (contacts[i].firstName === firstName) {
      if (contacts[i].hasOwnProperty(prop)) {
        return contacts[i][prop];
      }

      return "No such property";
    }
  }

  return "No such contact";
}

console.log(lookUpProfile("Kristian", "lastName"));

Кроме того, вы можете использовать немного более функциональный подход к программированию, используя Array#find():

var contacts = [{
    "firstName": "Akira",
    "lastName": "Laine",
    "number": "0543236543",
    "likes": ["Pizza", "Coding", "Brownie Points"]
  },
  {
    "firstName": "Harry",
    "lastName": "Potter",
    "number": "0994372684",
    "likes": ["Hogwarts", "Magic", "Hagrid"]
  },
  {
    "firstName": "Sherlock",
    "lastName": "Holmes",
    "number": "0487345643",
    "likes": ["Intriguing Cases", "Violin"]
  },
  {
    "firstName": "Kristian",
    "lastName": "Vos",
    "number": "unknown",
    "likes": ["Javascript", "Gaming", "Foxes"]
  }
];

function lookUpProfile(firstName, prop) {
  const contact = contacts.find(
    contact => contact.firstName === firstName
  );
  
  if (contact === undefined) {
    return "No such contact";
  }
  
  if (contact.hasOwnProperty(prop)) {
    return contact[prop];
  }
  
  return "No such property";
}

console.log(lookUpProfile("Kristian", "lastName"));
  • 0
    Я не знал о Array.find() +1
  • 0
    @Jhecht это было введено в спецификации ES6
Показать ещё 1 комментарий
1

Ваше выражение return "No such property"; должен быть вне цикла for. Внутри цикла for этот оператор завершает цикл после первой итерации.

Также вам не нужно, else if (... потому что вы возвращаете это извне for цикла.

//Setup
var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];


function lookUpProfile(firstName, prop) {

 for (var i = 0; i < contacts.length; i++) {
  if (contacts[i].firstName === firstName) {
   if (contacts[i].hasOwnProperty(prop)) {
     return contacts[i][prop];
   }   
  } 
 } 

 return "No such property";
}

// Change these values to test your function
console.log(lookUpProfile("Kristian", "lastName"))
console.log(lookUpProfile("Sherlock", "lastName"))

ИЛИ: Если вам удобно с Array#filter:

//Setup
var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];


function lookUpProfile(firstName, prop) {
  var res = contacts.filter(p => p.firstName === firstName);
  if (res.length > 0 && res[0].hasOwnProperty(prop)) {
   return res[0][prop];
  } 

 return "No such property";
}

// Change these values to test your function
console.log(lookUpProfile("Kristian", "lastName"))
console.log(lookUpProfile("Sherlock", "lastName"))
0

Вы можете применить метод фильтрации и проверить значения false

var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
         "lastName":"Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];

function lookUpProfile(firstName, prop) {
  let filtered=contacts.filter(c=>c.firstName==firstName);
  return filtered.map(f=>f[prop] || 'not found');
}
console.log(lookUpProfile("Kristian", "lastName"));

Если вы хотите вернуть только одну запись, вы можете использовать find

var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
         "lastName":"Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];

function lookUpProfile(firstName, prop) {
  let filtered=contacts.find(c=>c.firstName==firstName);
  return filtered[prop] || 'not found';
}
console.log(lookUpProfile("Kristian", "lastName"));
0

Я получил большую часть этой записи до Мамуна, но я хотел бы немного поговорить об этом ответе и о том, что вы делаете

Для моего решения я просто фильтрую массив только на то, что имеет правильное имя. Если вы уверены, что ваши элементы будут иметь разные имена, то это прекрасное решение, так как вы должны только ожидать, что длина фильтрованного массива будет равна 0 или 1. Теперь недостатком является то, что Array.filter() запускается по всей длине массива, продолжаясь даже после того, как мы нашли нашего человека. Для короткого массива, как пример, это не проблема. Для массива с 10 000 элементов и нашего человека - первая проблема поиска, которая представляет собой проблему с производительностью.

Другая проблема: что произойдет, если у вас более одного человека с тем же именем? Ну, ваш фильтрованный массив будет больше 1, но мы только когда-либо будем использовать первый результат - может быть проблемой.

Кроме того, если вы планируете часто просматривать информацию, вы можете захотеть использовать так называемую "хэш-карту" - это довольно простые вещи со сложными именами звучания.

Что делает одну запись уникальной от другой? В большинстве случаев у нас есть несколько идентификаторов, которые поставляются с данными из базы данных, но в этом случае у нас этого нет. Затем мы должны спросить себя, что делает "Кристиан Вос" иначе, чем "Кристистский Пауле" (предполагая, что оба находятся в одних и тех же данных). Используя то, что мы знаем, чтобы быть важной информацией об объектах (в данном случае, first + last name), мы создаем уникальный ключ для хранения данных в объекте. Таким образом, мы можем искать вещи намного быстрее, просто обращаясь к объекту с помощью наших сопоставленных ключей.

Моя точка зрения во всем этом: будьте осторожны, подумайте о том, что вы будете делать с вашим решением, и поймите, что небольшие наборы данных обычно дешевы для непрерывного поперечного перемещения, но представьте, почему по какой-то причине ваш массив содержит 10 000 или 100 000 записей - вы работая с данными самым разумным образом?

var contacts = [
    {
        "firstName": "Akira",
        "lastName": "Laine",
        "number": "0543236543",
        "likes": ["Pizza", "Coding", "Brownie Points"]
    },
    {
        "firstName": "Harry",
        "lastName": "Potter",
        "number": "0994372684",
        "likes": ["Hogwarts", "Magic", "Hagrid"]
    },
    {
        "firstName": "Sherlock",
        "lastName": "Holmes",
        "number": "0487345643",
        "likes": ["Intriguing Cases", "Violin"]
    },
    {
        "firstName": "Kristian",
        "lastName": "Vos",
        "number": "unknown",
        "likes": ["Javascript", "Gaming", "Foxes"]
    }
];

function lookUpProfile(firstName, prop){
  let profile = contacts.filter(person=> person.firstName == firstName);
  //Get only the person who has the same first name
  if(!profile.length) return false;
  //If the length is 0, then !0 will be truthy and the function will immediately return false
  profile = profile[0];
  //this is pure laziness, you could just alter the next line to read profile[0][prop] but I'll be honest i did this for visual appeal
  return profile[prop] || false;
  // this notation is fucky -- if the property is set on the profile, then it will return that value.
  // if it is not set, it'll return undefined, which is a falsey value and will therefore move over to the other side of the || and return that value, which is false.
}

console.log(lookUpProfile('Kristian', 'lastName'));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню