【问题标题】:How can I retrieve the object into an array in Javascript?如何将对象检索到 Javascript 中的数组中?
【发布时间】:2015-06-20 08:18:37
【问题描述】:

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

我的代码是这样的:

      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

【问题讨论】:

  • 什么for(var i in collection),collection在哪里
  • @fuyushimoya,刚刚更正了它的意思是 for(var i in second)。

标签: javascript arrays object javascript-objects


【解决方案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;
}

【讨论】:

  • obj是回调函数的参数。
【解决方案2】:

我认为 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
    }
})

【讨论】:

  • 看起来很漂亮很短,但我不确定,会尝试使用它。
  • 哎呀。我其实忘记了什么。在凌晨 5 点帮助人们可能不是一件好事。需要循环 myobj 以获取每个对象的键:
  • 我认为 Nina Scholz 的回答可能是最好的。
  • 谢谢!我必须感谢您的支持,我愿意。
【解决方案3】:
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;
}

【讨论】:

  • @fuyshimoya,谢谢!我什至无法投票。您完美地过滤了“第三个”的值。
  • 我编辑了,为你使用hasOwnProperty,如果你的对象是由一些扩展原型扩展或创建的,你可能会担心。
  • 如果我想使用 Object.keys(),方法是什么。假设我是新手。
  • @user2906838,看我的回答。
  • @fuyushimoya, ya hasOwnProperty 似乎不是一个好主意,实际上我不知道我还能怎么走。所以我只是认为使用它应该在非常低的层次上理解,实际上你的第一个答案更容易理解,但这也很简单。谢谢你澄清我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多