【问题标题】:How can I get a find an object in an array by a property?如何通过属性在数组中查找对象?
【发布时间】:2015-01-09 15:56:40
【问题描述】:

我从 php 脚本返回了以下数组。

$data =  [
    {
        "id": "1",
        "created_at": "2015-01-02 15:17:29",
        "updated_at": "2015-01-02 15:17:29",
        "name": "Minecraft",
        "description": "",
        "location": "ideaLab",
        "cost": "20.00",
        "min_age": "7",
        "max_age": null,
        "start_date": "2014-11-06",
        "end_date": "2014-12-11",
        "start_time": "16:30:00",
        "end_time": "17:30:00",
        "registration_start_date": "2014-10-28",
        "registration_end_date": "0000-00-00",
        "program_id": "1",
        "max_attendees": "12"
    },
    {
        "id": "2",
        "created_at": "2015-01-02 15:17:29",
        "updated_at": "2015-01-02 15:17:29",
        "name": "Mini Makers",
        "description": "",
        "location": "ideaLab",
        "cost": "18.00",
        "min_age": "9",
        "max_age": "7",
        "start_date": "2014-11-04",
        "end_date": "2014-12-09",
        "start_time": "16:30:00",
        "end_time": "17:30:00",
        "registration_start_date": "2014-10-28",
        "registration_end_date": "0000-00-00",
        "program_id": "2",
        "max_attendees": "20"
    }
];

如何通过id选择对象?如果有意义的话,类似于$obj = select * where id=$id 的 SQL 等价物。

【问题讨论】:

  • 遍历数组?顺便说一句,只要它是一个字符串,它就只是 JSON。解析后它只是一个 JavaScript 对象。
  • 只需将它们全部放入一个列表中遍历它们,直到找到它或使用地图。
  • 您可以使用JSONPath 作为更优雅的解决方案
  • 任何答案对你有用吗?

标签: javascript jquery


【解决方案1】:

您可以使用接受id 作为参数的通用函数并返回对象(如果 id 存在)

function getObjectById(id) {
   for (var i = 0; i < $data.length; i++) {
      if ($data[i]['id'] === id) {
         return $data[i];
      }
   }
   return {};
}

但如果您的输出正是您发布的内容,并且您没有在序列中丢失id,您可以将函数体缩减为

return (id > 0 && id <= $data.length) ? $data[id - 1] : {}

(在这种情况下,我假设您将整数作为id 传递)

【讨论】:

  • 最直接的答案,但如果找不到,我可能会返回null
  • 我会用 == 而不是 === 因为 id 是一个字符串,可以用作数字?
  • @Haketo 我只是更喜欢默认的严格比较。只要值都是字符串并且您将字符串作为参数传递,那么=== 就可以了
  • 这是 PHP 还是 JavaScript?
  • 这是 vanillaJS @PraveenKumar
【解决方案2】:

您可以使用这样的小脚本:

function findJSONById(needle, jsonString)
{
  var finalJSON = {};
  $.each(JSON.parseJSON(jsonString), function (key, value) {
    if (value["id"] == needle)
    {
      finalJSON = value;
      return false; // break the loop
    }
  });
  return finalJSON;
}

【讨论】:

  • return 不会从外部函数返回。
  • 我还添加了一些关键字。
  • 该死!我怎么会错过呢? :O好吧我困了,我要睡觉了! :P
【解决方案3】:

如果你使用 jQuery,有一个不错的函数:$.grep

它根据过滤函数过滤输入数组。

var objectWithId2 = $.grep(data, function (obj) { 
    return obj.id == 2; 
})[0];

【讨论】:

    【解决方案4】:

    试试

    var filtered = function(data, id) {
      return data.filter(function(items, i) {
        return items.id === id
      })
    };
    
    console.log(filtered("1"));
    

    【讨论】:

      【解决方案5】:

      你会使用:

      $data[0].id
      

      所以,通过它的 id 来获取对象:

      $data[$id+1]  //so long as their position in the array is not shuffled.
      

      或者,只要你使用 jQuery,这样的东西应该会有所帮助:

      $.each(data, function(index) {  console.log(data[i].id); }); 
      

      【讨论】:

      • 获取每个对象的 id。 OP 希望通过其 id 找到整个对象。
      • 我猜应该是 $id - 1。
      猜你喜欢
      • 2011-07-31
      • 2013-07-05
      • 1970-01-01
      • 2022-08-24
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多