2016-01-13 43 views
1

如果这对你来说是一个愚蠢的问题,请忽略。我刚刚提出了自己的问题解决方案,但我知道它不是一个好的解决方案,并且有更好的方法可以做到这一点,请回答是否有其他解决方案只使用JavaScript。通过对象数组迭代的不同方法javascript?

它要求创建一个函数来遍历一个对象数组,并且如果firstName匹配该配置文件,则返回该对象的prop。如果firstName或prop提供给未找到的函数,则返回一些语句。

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

 
    for (var i = 0; i < contacts.length; i++){ 
 
      var n = parseInt(contacts.length); 
 

 
     
 
      if (contacts[i].firstName === firstName) { 
 
      
 
       if (contacts[i].hasOwnProperty(prop)){ 
 
        return contacts[i][prop]; 
 
       } 
 
       else return "No such property"; 
 
       } 
 
      else if (i === (n-1)) { 
 
       return "No such contact"; 
 
      } 
 
    } 
 
} 
 

 
console.log(lookUp("Sherlock", "likes"));

+0

你被允许使用库? –

+0

看Array.filter https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter –

+0

没有库,只是普通的javascript – Leorczhu

回答

0

您可以通过使用forEach

function lookUp(firstName, prop) 
{ 
    var propValue = "No such contact"; 

    contacts.forEach(function(element){ 
    if (element.firstName == firstName) 
    { 
     propValue = element[ prop ] ? element[ prop ] : "No such property"; 
    } 
    }); 
    return propValue; 
} 

而且你loopUp方法来改变这一点,就像@Amadan提及而不是返回的错误信息,抛出Error回来,您将需要赶上调用方法。

try 
{ 
    lookUp();//making call here 
} 
catch(e) 
{ 
    console.error(e); 
} 
2
  • contacts.length是一个整数,而不是字符串,所以parseInt是不必要的。

  • 实际上你并不需要else if:你可以把它放在循环之外,因为如果联系人存在,你已经退出了该功能。这也使得n不必要,并且第一点没有意义。一般来说,返回错误信息是一个坏主意,除非它们明显区分为错误信息(请参阅semipredicate problem);否则,返回错误信息是一个不好的主意。那些应该作为例外抛出,或者至少作为非值返回null/undefined;或者当您询问lookUp('Adolf', 'favouriteSoup')时,您可能会认为这种汤被称为"No such contact"。但是,如果您提供的任务是返回错误消息,我不认为您可以对此做任何事情。

+0

我同意。提出例外是更好的做法。如果属性值是“没有这样的联系”,那将是非常荒谬的,无法区分有效和无效输出。 –

0

我建议将两个想要的功能分为两个功能。

  1. 获取与给定的键/值对所有对象lookUp(a, k, v)
  2. 从对象的数组仅获得一个关键getKey(a, k)

function lookUp(a, k, v) { 
 
    return a.filter(function (b) { 
 
     return b[k] === v; 
 
    }); 
 
} 
 

 
function getKey(a, k) { 
 
    return a.map(function (b) { 
 
     return k in b? b[k]: 'no property ' + k; 
 
    }); 
 
} 
 

 
function print(o) { 
 
    document.write('<pre>' + JSON.stringify(o, 0, 4) + '</pre>'); 
 
} 
 

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

 
print(lookUp(contacts, 'firstName', 'Sherlock')); 
 
print(getKey(lookUp(contacts, 'firstName', 'Sherlock'), 'likes'));