【问题标题】:Trying to filter an main array with filter array and get the result尝试使用过滤器数组过滤主数组并获得结果
【发布时间】:2020-07-08 12:45:42
【问题描述】:

我正在尝试根据过滤器值数组过滤结果。 下面是主数组

var mainArray = [
    { id: 1, Country: ["India"], Version: "v1" },
    { id: 2, Country: ["US", "UK"], Version: "v2" },
    { id: 3, Country: ["Australia"], Version: "v3" },
    { id: 4, Country: ["UK"], Version: "v4" },
    { id: 5, Country: ["UK"], Version: "v3" },
    { id: 6, Country: ["US"], Version: "v2" },
    { id: 7, Country: ["Australia"], Version: "v4" },
    { id: 8, Country: ["India"], Version: "v2" }
];

这是过滤条件:

var filterValue = [
    {
        name: "Country",
        value: [
            { text: "India", checked: true },
            { text: "US", checked: true },
            { text: "UK", checked: false },
            { text: "Australia", checked: false }
        ]
    },
    {
        name: "Version",
        value: [
            { text: "v1", checked: true },
            { text: "v2", checked: true },
            { text: "v3", checked: false },
            { text: "v4", checked: false }
        ]

    }
]

下面是基于我想要得到的 filterValue 的 resultArray:

var resultArray = [
    { id: 1, Country: ["India"], Version: "v1" },
    { id: 2, Country: ["US", "UK"], Version: "v2" },
    { id: 6, Country: ["US"], Version: "v2" },
    { id: 8, Country: ["India"], Version: "v2" }
];

感谢您的帮助。

【问题讨论】:

  • 您忘记添加遇到问题的实际代码。
  • 另外,你不能有两个resultArray - 实际上预期的结果是什么?

标签: javascript arrays filter


【解决方案1】:

假设您希望在所有过滤器上使用 AND,请使用以下内容:

let results = mainArray.filter(main => {

  // map every filter on each main value
  let filters = filterValue.map(filter => {

    // normalize filter values
    let key = filter.name,
        val = filter.value.filter(r => r.checked).map(r => r.text);
    // console.log(key, val);
    // > "Country", [ 'India', 'US' ]
    // > "Version", [ 'v1', 'v2' ]  
    
    let prop = main[key];

    // filter out empties
    if (!prop)
      return 0;

    // single string to an array
    if (!Array.isArray(prop))
      prop = [prop];

    // intersect prop and val arrays
    return prop.filter(r => val.includes(r)).length
  });
  
  // return wether all conditions match
  return filters.every(r => !!r);
});

【讨论】:

    【解决方案2】:

    我使用了这些JavaScript Array Methodsfilter()find()includes

    希望这会有所帮助:

            var mainArray = [
                { id: 1, Country: ["India"], Version: "v1" },
                { id: 2, Country: ["US", "UK"], Version: "v2" },
                { id: 3, Country: ["Australia"], Version: "v3" },
                { id: 4, Country: ["UK"], Version: "v4" },
                { id: 5, Country: ["UK"], Version: "v3" },
                { id: 6, Country: ["US"], Version: "v2" },
                { id: 7, Country: ["Australia"], Version: "v4" },
                { id: 8, Country: ["India"], Version: "v2" }];
    
            var filterValue=[{
                name: "Country",
                value: [
                        { text: "India", checked: true },
                        { text: "US", checked: true },
                        { text: "UK", checked: false },
                        { text: "Australia", checked: false }
                    ]}, {
                 name: "Version",
                 value: [
                        { text: "v1", checked: true },
                        { text: "v2", checked: true },
                        { text: "v3", checked: false },
                        { text: "v4", checked: false }
                    ]}];
                
            var result=  mainArray.filter(function(item){
                var country= filterValue[0].value.find(x=>x.checked&&item.Country.includes(x.text));
                var version= filterValue[1].value.find(x=>x.checked&&x.text==item.Version);
                return country&&version;
            });
    
            for(var i=0;i<result.length;i++)
                console.log(JSON.stringify(result[i])); 

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多