【问题标题】:Best way to filter the array of objects过滤对象数组的最佳方法
【发布时间】:2019-02-09 16:36:54
【问题描述】:

我有一个对象数组,其中包含一个我想要过滤的名为“Country”的属性。我让用户选择他们想要查看的国家/地区并希望返回由该属性过滤的对象数组。完成此过程的最有效方法是什么?

  var countries = [{GINI: 56.2, Country: "Central African Republic", Values: Array, Date: "2008"},
  {GINI: 51.3, Country: "Brazil", Values: Array, Date: "2015"},{GINI: 51.1, Country: "Columbia", Values: Array, Date: "2015"}]


 var selectedCountries = ["Central African Republic", "Columbia"];

 var filteredCountries = countries.filter(country =>{

  ??  
 });

输出应该是包含匹配项的国家数组的过滤版本

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您可以使用includesfilter

    const countries = [{GINI: 56.2, Country: "Central African Republic", Values: Array, Date: "2008"},{GINI: 51.3, Country: "Brazil", Values: Array, Date: "2015"},{GINI: 51.1, Country: "Columbia", Values: Array, Date: "2015"}]
    const selectedCountries = ["Central African Republic", "Columbia"];
    
    const filteredCountries = countries.filter(({Country})=>selectedCountries.includes(Country));
    
    console.log(filteredCountries)

    我更喜欢将selectedCountries 用作Object 而不是Array。不必每次都在 Array 上循环。

    const countries = [{GINI: 56.2, Country: "Central African Republic", Values: Array, Date: "2008"},{GINI: 51.3, Country: "Brazil", Values: Array, Date: "2015"},{GINI: 51.1, Country: "Columbia", Values: Array, Date: "2015"}]
    
    const selectedCountries = {
     "Central African Republic": true,
     "Columbia": true
    };
    
    const filteredCountries = countries.filter(({Country})=>selectedCountries[Country]);
    
    console.log(filteredCountries)

    【讨论】:

    • 我不明白使用selectedCountries作为对象背后的想法
    • @ShubhDixit 比您可以直接根据键访问值。它的时间复杂度为O(1),而在数组上为O(n)
    • 只是为了记录,如果你能抛出一些光,它会是O(1)吗?
    • @ShubhDixit JS 对象使用哈希,您可以阅读此答案,这将有助于stackoverflow.com/questions/45266944/…
    【解决方案2】:

    使用Array.reduce() 通过Country (O(n)) 创建一个Map。然后map请求的国家列表(O(m)),并从地图中获取国家。复杂度为 O(n + m)。

    const countries = [{GINI: 56.2, Country: "Central African Republic", Values: [], Date: "2008"}, {GINI: 51.3, Country: "Brazil", Values: Array, Date: "2015"},{GINI: 51.1, Country: "Columbia", Values: [], Date: "2015"}];
    
    const selectedCountries = ["Central African Republic", "Columbia"];
    
    const countryMap = countries.reduce((m, o) => m.set(o.Country, o), new Map);
    
    const filteredCountries = selectedCountries.map(c => countryMap.get(c));
    
    console.log(filteredCountries);

    【讨论】:

      【解决方案3】:

      你可以使用array.indexOf函数

       var countries = [{GINI: 56.2, Country: "Central African Republic", Values: Array, Date: "2008"},
        {GINI: 51.3, Country: "Brazil", Values: Array, Date: "2015"},{GINI: 51.1, Country: "Columbia", Values: Array, Date: "2015"}]
      
      
       var selectedCountries = ["Central African Republic", "Columbia"];
      
       var filteredCountries = countries.filter(country =>selectedCountries.indexOf(country.Country)!=-1);
       console.log(filteredCountries)

      【讨论】:

        【解决方案4】:

        您可以使用 Array.prototype.includes()

        检查对象的国家/地区是否在 selectedCountries

        var countries = [{
            GINI: 56.2,
            Country: "Central African Republic",
            Values: Array,
            Date: "2008"
          },
          {
            GINI: 51.3,
            Country: "Brazil",
            Values: Array,
            Date: "2015"
          }, {
            GINI: 51.1,
            Country: "Columbia",
            Values: Array,
            Date: "2015"
          }
        ]
        var selectedCountries = ["Central African Republic", "Columbia"];
        const filteredCountries = countries.filter(count => selectedCountries.includes(count.Country))
        console.log(filteredCountries)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          • 1970-01-01
          • 2021-06-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多