通过儿童数组和对象值选择对象

问题描述:

我从Facebook获取来自object的数据,并且想要选择子项值为xxx的array中的所有objects通过儿童数组和对象值选择对象

object(简化当然)的结构是这样的:

var friends = [ 
    { 
     id: 123456, 
     name: "Friend1 name", 
     education: [ 
      { 
       school: { 
        name: "School1 name" 
       }, 
       type: "Highscool" 
      } 
     ] 
    }, 
    { 
     id: 3456789, 
     name: "Friend2 name", 
     education: [ 
      { 
       school: { 
        name: "School2 name" 
       }, 
       type: "College" 
      } 
     ] 
    } 
] 

让我们假设我想用education.type =“Highscool”的所有对象。我怎么能做到这一点,没有循环,虽然整个对象...?

+0

我不知道这是可能没有某种循环 –

+0

的我affraid的是...: -/ –

+0

有多少元素可以'教育“有?我们应该只检查第一个“教育[0]”吗? – dfsq

我该如何做到这一点,没有循环虽然整个对象...?

你不行。不过,这并不必须是硬:

var highSchoolFriends = friends.filter(function(friend) { 
    var keep = false; 
    friend.education.some(function(entry) { 
     if (entry.type === "Highschool") { 
      keep = true; 
      return true; 
     } 
    }); 
    return keep; 
}); 

使用了ES5 Array#filterArray#some功能。 filter返回由friends数组中的条目组成的新数组,迭代器函数返回truesome循环遍历一个数组,直到你给出的迭代函数返回true(我用它代替了Array#forEach,因为你可以尽早停止它)。如果你需要支持那些还没有的浏览器,那么它们就是“ES5垫片”能给你的那些浏览器。

,或者你只是做了简单的循环:

var i, j; 
var highSchoolFriends = []; 
var friend; 

for (i = 0; i < friends.length; ++i) { 
    friend = friends[i]; 
    for (j = 0; j < friend.education.length; ++j) { 
     if (friend.education[j].type === "Highschool") { 
      highSchoolFriends.push(friend); 
      break; 
     } 
    } 
}); 
+0

谢谢您的回复。这并不难,但我的朋友名单很大,而且该应用程序适用于手机,所以我希望不要做太多循环。但我想没有别的办法......谢谢你的时间。 –

+0

@KennethB:不用担心,希望有所帮助。 –