2015-06-20 48 views
0

我目前正在练习js中的一些基本问题,并且对这些语言中的任何一种都是比较新的。如果另一个obj“third”具有相同的属性值,我想从属性“second”中将属性的值和名称检索到数组“temp”中。 我可以做到这一点,当属性名称已经定义,但我怎么能做到这一点,如果我不知道实际的属性名称。可使用Object.keys()如何将对象检索到Javascript中的数组?

我的代码是这样的:

 function where(second, third) { 
    var arr = []; 
    var temp=[]; 
    for(var i in second) 
    { 

     if(third.hasOwnProperty('last')){ 
     if(second[i].last===third.last){ 
      arr=second[i]; 
      temp.push(arr); 
     } 
     } 
     if(third.hasOwnProperty('first')){ 
     if(second[i].first===third.first){ 
      arr=second[i]; 
      temp.push(arr); 
     } 
     } 

    } 
    return temp; 
} 

where([{ first: 'Ram', last: 'Ktm' }, { first: 'Sam', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' }); 

结果数组是:[{ 'first': 'Tybalt', 'last': 'Capulet' }]

我怎样才能获得相同的结果,即使我不知道实际的属性名称。例如,这里的名字首先和最后可能是食物,而其用途是未知的。 我已经在这里使用了以下线程。

[2]: https://stackoverflow.com/questions/4607991/javascript-transform-object-into-array

[1]: https://stackoverflow.com/questions/4607991/javascript-transform-object-into-array

+0

请告诉我'为(VAR我在集合)',哪来的'collection' – fuyushimoya

+0

@fuyushimoya,只是修正了它意思是为了(var我在第二)。 – user2906838

回答

1
function where(second, third) { 
    var temp = []; 
    var k = Object.keys(third)[0]; // expecting only one element! 
    second.forEach(function (obj) { 
     if (obj[k] === third[k]) { 
      temp.push(obj); 
     } 
    }); 
    return temp; 
} 
+0

谢谢!不应该在任何地方定义obj? – user2906838

+0

'obj'是回调函数的参数。 –

0
function where(second, third) { 
    var tmp = []; 
    var length = second.length; 

    var i, k, test; 
    // Go through second's each item to see that... 
    for (i = 0; i < length; ++i) { 
    test = second[i]; 
    // For all key in third that belongs to third (not inherited or else) 
    for (k in third) { 
     // Check has own property. 
     if (!third.hasOwnProperty(k)) { 
     continue; 
     } 
     // If second[i] don't have key `k` in second or second[i][k]'s value is 
     // not equal to third[k], then don't put it into tmp, start to check next. 
     if (!third.hasOwnProperty(k)) { 
     break; 
     } else if (test[k] !== third[k]) { 
     break; 
     } 
     tmp.push(test); 
    } 
    } 
    return tmp; 
} 
+0

@fuyshimoya,谢谢!我甚至不能投票。你完美地过滤了“第三”的价值。 – user2906838

+0

我编辑过,因为你使用'hasOwnProperty',如果你的对象是由一些扩展原型扩展或创建的,你可能会关心这个'hasOwnProperty'。 – fuyushimoya

+0

如果我希望使用Object.keys(),那么方法是什么?假设我很新手。 – user2906838

1

我觉得getOwnPropertyName是你在找什么。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

Object.getOwnPropertyNames({a:1,2:"b",c:"a"}).sort() // returns Array [ "2", "a", "c" ] 

我会在最初的回答扩大

var temp = []; 

var myobj = [{cat:"Felix",dog:"Milo",bird:"Monkey",3:"pets"}, 
     {cat:"Wiskers",dog:"yapper",bird:"tweeter",1:"human"}]; 

var myobj2 = {cat:"Harry",dog:"Fuzz",1:"human"}; 

var objKeys = Object.getOwnPropertyNames(myobj); //will have key "1" that matches below 

objKeys.forEach(function(key) { 
    if(myobj2.hasOwnProperty(key)) { 
     temp.push(myobj2[key]) // will push "human" to temp array 
    } 
}) 
+0

这看起来很漂亮,但我不确定,会尝试使用这个。 – user2906838

+0

哎呦。我其实忘了一些东西。凌晨5点帮助人们可能不是一件好事..需要循环myobj以获取每个对象的关键字:< –

+0

我认为Nina Scholz的答案可能是最好的。 –

相关问题