【问题标题】:Is this a good (efficient) way to solve this JavaScript exercise这是解决此 JavaScript 练习的好(有效)方法吗
【发布时间】:2017-07-26 20:11:58
【问题描述】:

这是来自 FreeCodeCamp 的一个练习,我想知道这个解决方案是否足够好,或者我应该以不同的方式解决它:

锻炼

我们的联系人列表中有一组代表不同人的对象。

已经为您预先编写了一个以 firstName 和一个属性 (prop) 作为参数的 lookUpProfile 函数。

该函数应检查 firstName 是否是实际联系人的名字,并且给定的属性 (prop) 是该联系人的属性。

如果两者都为真,则返回该属性的“值”。

如果 firstName 不对应任何联系人,则返回“No such contact”

如果 prop 不对应任何有效属性,则返回“No such property”

解决方案:

//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"]
    }
];

// SOLUTION

function lookUpProfile(firstName, prop) {
	var checkName = "";
	for (var i = 0; i < contacts.length; i++) {
		if (contacts[i].firstName === firstName) {
			checkName = contacts[i].firstName;
			break;	
		} else { 
			checkName = "No such contact";
		}
	  }
	var checkProp = "";
	for (var j = 0; j < contacts.length; j++) {
		if ((contacts[j].hasOwnProperty(prop)) === true && checkName != "No such contact") {
			checkProp = contacts[i][(prop)];
		  	break;	
		} else { 
			checkProp = "No such property";		
		}
	  }
	
	switch (checkName) {
		case "No such contact":
			console.log (checkName); // I have put there return instead of console.log.
		default:
			console.log (checkProp); // I have put there return instead of console.log.
	}
  
// Only change code above this line
}

// Change these values to test your function

lookUpProfile("Sherlock", "likes");

另一个重要问题: 我花了大约 2.5 小时,所以解决了这个问题(我是初学者,每次学习循环,我都在挣扎)。

这是正常的还是我之前应该找到解决办法?

谢谢!!学习编程很困难,但很有意义!!

【问题讨论】:

  • 这个应该可以移到Code Review
  • 这是一个有趣的问题。但是,此站点并不是提出此类问题的最佳场所。 Stack Overflow 专门针对代码不起作用。相反,您应该将问题发布到Code Review
  • Opps 对不起,甚至不知道代码审查网页的存在。

标签: javascript arrays javascript-objects


【解决方案1】:

简单的解决方案;

const lookup = (firstName, prop) => {
  const person = contacts.find(p => p.firstName === firstName);
  if (!person) {
    return 'No such contact';
  }
  if (!person[prop]) {
    return 'No such property';
  }
  return person[prop];
};


const person = lookup('Kristian', 'likes');

【讨论】:

  • 我认为根据 OP 的要求,它将是 return person[prop]
  • 再一次,我认为你可以直接返回person[prop],因为你已经检查了personperson[prop]是否存在!
【解决方案2】:

好吧,我的解决方案是有效的,但我认为非常复杂且浪费资源。

一个非常简单的解决方法是:

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];
        } else {
          return "No such property";
        }
		}
		
	}
	return "No such contact";

【讨论】:

    【解决方案3】:

    更快的解决方案是将find 函数用于数组。比如:

    var person = contacts.find(function(contact) {
       return contact.firstName === firstName;
    });
    if (!person) {
        return 'No such contact';
    }
    if (!person[prop]) {
        return 'No such property';
    }
    return person[prop];
    

    可能很难学习/了解所有可用的工具和功能,但在这种情况下,find function 非常有用。

    正如 cmets 中所述,这更适合 code review stack exchange,但我想我会在此期间给你一个答案。

    【讨论】:

    • 你运行了这段代码吗?过滤器返回一个数组,所以 !person 永远不会发生。你在寻找 Aarray.prototyp.find 吗?
    • 这里有几个错误——过滤器应该检查contact.firstName而不是person.firstName.filter 返回一个数组,所以后面的测试应该针对person[0](或者最好检查 person 数组中的每个项目是否匹配 prop
    • @petel 感谢您的来信。我打算引用 person[0],但忽略了它。 find 是一个更好的选择,所以我编辑了我的代码以反映这一点。
    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多