【问题标题】:javascript filter array of objectsjavascript过滤对象数组
【发布时间】:2012-11-15 16:43:47
【问题描述】:

我有一个对象数组,我想知道搜索它的最佳方法。鉴于以下示例,我如何搜索 name = "Joe"age < 30? jQuery 有什么可以帮助的吗?还是我必须自己强制执行此搜索?

var names = new Array();

var object = { name : "Joe", age:20, email: "joe@hotmail.com"};
names.push(object);

object = { name : "Mike", age:50, email: "mike@hotmail.com"};
names.push(object);

object = { name : "Joe", age:45, email: "mike@hotmail.com"};
names.push(object);

【问题讨论】:

  • 搜索是指过滤吗?
  • 搜索 != 过滤器。你要哪个?

标签: javascript jquery arrays


【解决方案1】:

Array.prototype.filter() 的现代解决方案:

const found_names = names.filter(v => v.name === "Joe" && v.age < 30);

或者如果你还在使用 jQuery,你可以使用jQuery.grep():

var found_names = $.grep(names, function(v) {
    return v.name === "Joe" && v.age < 30;
});

【讨论】:

    【解决方案2】:

    您可以使用[].filter 方法非常轻松地做到这一点:

    var filterednames = names.filter(function(obj) {
        return (obj.name === "Joe") && (obj.age < 30);
    });
    

    您可以通过this MDN page了解更多信息。

    【讨论】:

      【解决方案3】:

      您可以利用jQuery.filter() 函数从匹配元素的子集中返回元素。

      var names = [
          { name : "Joe", age:20, email: "joe@hotmail.com"},
          { name : "Mike", age:50, email: "mike@hotmail.com"},
          { name : "Joe", age:45, email: "mike@hotmail.com"}
         ];
         
         
      var filteredNames = $(names).filter(function( idx ) {
          return names[idx].name === "Joe" && names[idx].age < 30;
      }); 
      
      $(filteredNames).each(function(){
           $('#output').append(this.name);
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      
      <div id="output"/>

      【讨论】:

        【解决方案4】:

        var nameList = [
        {name:'x', age:20, email:'x@email.com'},
        {name:'y', age:60, email:'y@email.com'},
        {name:'Joe', age:22, email:'joe@email.com'},
        {name:'Abc', age:40, email:'abc@email.com'}
        ];
        
        var filteredValue = nameList.filter(function (item) {
              return item.name == "Joe" && item.age < 30;
        });
        
        //To See Output Result as Array
        console.log(JSON.stringify(filteredValue));

        你可以简单地使用 javascript :)

        【讨论】:

          【解决方案5】:

          对于那些想要使用任意键从对象数组中过滤的人:

          function filterItems(items, searchVal) {
            return items.filter((item) => Object.values(item).includes(searchVal));
          }
          let data = [
            { "name": "apple", "type": "fruit", "id": 123234 },
            { "name": "cat", "type": "animal", "id": 98989 },
            { "name": "something", "type": "other", "id": 656565 }]
          
          
          console.log("Filtered by name: ", filterItems(data, "apple"));
          console.log("Filtered by type: ", filterItems(data, "animal"));
          console.log("Filtered by id: ", filterItems(data, 656565));

          从 JSON 对象数组中过滤:**

          【讨论】:

            【解决方案6】:

            var names = [{
                    name: "Joe",
                    age: 20,
                    email: "joe@hotmail.com"
                },
                {
                    name: "Mike",
                    age: 50,
                    email: "mike@hotmail.com"
                },
                {
                    name: "Joe",
                    age: 45,
                    email: "mike@hotmail.com"
                }
            ];
            const res = _.filter(names, (name) => {
                return name.name == "Joe" && name.age < 30;
            
            });
            console.log(res);
            &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"&gt;&lt;/script&gt;

            【讨论】:

              【解决方案7】:

              这么快的问题。如果您有两个对象数组,并且您想“对齐”这些对象数组,以确保每个数组的对象与另一个数组的顺序相同,该怎么办?如果您不知道数组中的任何对象包含哪些键和值怎么办...更不用说它们的顺序了?

              因此,您需要为[].filter[].map 等提供“通配符表达式”。如何获得通配符表达式?

              var jux = (function(){
                  'use strict';
              
                  function wildExp(obj){
                      var keysCrude = Object.keys(obj),
                          keysA = ('a["' + keysCrude.join('"], a["') + '"]').split(', '),
                          keysB = ('b["' + keysCrude.join('"], b["') + '"]').split(', '),
                          keys = [].concat(keysA, keysB)
                              .sort(function(a, b){  return a.substring(1, a.length) > b.substring(1, b.length); });
                      var exp = keys.join('').split(']b').join('] > b').split(']a').join('] || a');
                      return exp;
                  }
              
                  return {
                      sort: wildExp
                  };
              
              })();
              
              var sortKeys = {
                  k: 'v',
                  key: 'val',
                  n: 'p',
                  name: 'param'
              };
              var objArray = [
                  {
                      k: 'z',
                      key: 'g',
                      n: 'a',
                      name: 'b'
                  },
                  {
                      k: 'y',
                      key: 'h',
                      n: 'b',
                      name: 't'
                  },
                  {
                      k: 'x',
                      key: 'o',
                      n: 'a',
                      name: 'c'
                  }
              ];
              var exp = jux.sort(sortKeys);
              
              console.log('@juxSort Expression:', exp);
              console.log('@juxSort:', objArray.sort(function(a, b){
                  return eval(exp);
              }));
              

              您还可以在每个对象的迭代中使用此函数,以便为每个对象中的所有键创建更好的集体表达式,然后以这种方式过滤您的数组。

              这是我几乎完成的 API Juxtapose 中的一个小 sn-p,它可以做到这一点,对象相等与豁免、对象统一和数组压缩。如果这些是您的项目需要或想要的东西,请发表评论,我会尽快使该库可访问。

              希望这会有所帮助!快乐编码:)

              【讨论】:

                【解决方案8】:

                最直接和易读的方法是使用原生 javascript 过滤方法。

                原生 JavaScript 过滤器采用声明式方法过滤数组元素。由于它是在 Array.prototype 上定义的方法,因此它在提供的数组上进行迭代并在其上调用回调。这个回调函数,作为我们的过滤函数,接受三个参数:

                element — 正在迭代的数组中的当前项

                index — 正在迭代的数组中当前元素的索引或位置

                array — 应用过滤器方法的原始数组 让我们在一个例子中使用这个过滤方法。请注意,过滤器可以应用于任何类型的数组。在此示例中,我们将根据对象属性过滤对象数组。

                根据对象属性过滤对象数组的示例如下所示:

                // Please do not hate me for bashing on pizza and burgers.
                // and FYI, I totally made up the healthMetric param :)
                let foods = [
                  { type: "pizza", healthMetric: 25 },
                  { type: "burger", healthMetric: 10 },
                  { type: "salad", healthMetric: 60 },
                  { type: "apple", healthMetric: 82 }
                ];
                let isHealthy = food => food.healthMetric >= 50;
                
                const result = foods.filter(isHealthy);
                
                console.log(result.map(food => food.type));
                // Result: ['salad', 'apple']
                

                要了解有关在函数中过滤数组并构建自己的过滤的更多信息,请查看这篇文章: https://medium.com/better-programming/build-your-own-filter-e88ba0dcbfae

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-12-16
                  • 2021-07-05
                  • 2020-08-27
                  • 2020-10-21
                  • 2019-10-07
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多