2015-06-20 74 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的答案可能是最好的。 –

相關問題