【问题标题】:filter using dynamic values in typescript使用打字稿中的动态值进行过滤
【发布时间】:2020-07-26 08:50:36
【问题描述】:

我的要求是过滤所有Portfolio LeadEnglish Competency 和值为No 的人。

 var data = [{
    "Employee Number": 138,
    "English Competency": "No",
    "Portfolio Lead": "x",
    "Maths Competency": "No"
  },
  {
    "Employee Number": 1385,
    "English Competency": "yes",
    "Portfolio Lead": "x",
    "Maths Competency": "yes"
  },
  {
    "Employee Number": 1318,
    "English Competency": "yes",
    "Portfolio Lead": "y",
    "Maths Competency": "No"
  },
  {
    "Employee Number": 1388,
    "English Competency": "No",
    "Portfolio Lead": "y",
    "Maths Competency": "yes"
  },
  {
    "Employee Number": 1388,
    "English Competency": "No",
    "Portfolio Lead": "z",
    "Maths Competency": "no"
  }
];

******************更新****************************** ****

下面的代码可以正常工作,但在employeeData 中它只是显示数字而不是实际数据。请帮忙

var leadsList = ['x','y','z']

function getcompetencyData(name) {

  let filteredCompetency = data.filter(item => item[name] == "No");
  console.log(filteredCompetency);

  let leadData = [];
  let employeeData = [];
  leadsList.forEach(lead => {
    filteredCompetency.forEach(competency => {
      if (lead === competency["Portfolio Lead"]) {
        leadData.push({ "Portfolio Lead": lead, "employeeData": employeeData.push(competency) })
      }
    })
  });
  console.log(leadData);
}

getcompetencyData('English Competency');

请告诉我我在这里做错了什么。以下是stackblitz链接

https://stackblitz.com/edit/typescript-n5j5y6

【问题讨论】:

  • 除非您只想专门使用一些在字段中带有“否”的“潜在客户”,否则将它们放在过滤器中或对其进行迭代是没有意义的。
  • 但我想要那样

标签: javascript arrays angular typescript filter


【解决方案1】:

像这样试试。

var data = [{
    "Employee Number": 138,
    "English Competency": "No",
    "Portfolio Lead": "x",
    "Maths Competency": "No"
  },
  {
    "Employee Number": 1385,
    "English Competency": "yes",
    "Portfolio Lead": "x",
    "Maths Competency": "yes"
  },
  {
    "Employee Number": 1318,
    "English Competency": "yes",
    "Portfolio Lead": "y",
    "Maths Competency": "No"
  },
  {
    "Employee Number": 1388,
    "English Competency": "No",
    "Portfolio Lead": "y",
    "Maths Competency": "yes"
  },
  {
    "Employee Number": 1388,
    "English Competency": "No",
    "Portfolio Lead": "z",
    "Maths Competency": "no"
  }
];

let x = [];
let y = [];
let z = [];

function filterData(key, val) {
    data.map(lead => {
        if(lead[key] === val) {
         if (lead['Portfolio Lead'] === 'x') return x.push(lead)
         if (lead['Portfolio Lead'] === 'y') return y.push(lead)
         if (lead['Portfolio Lead'] === 'z') return z.push(lead)  
        }
        return
    })
}

filterData('Maths Competency', 'No');
console.log(x, y, z);

filterData('English Competency', 'No');
console.log(x, y, z);

或者您也可以将Portfolio Lead 值作为参数传递给函数。 如果您仍有疑问,请告诉我。

【讨论】:

    【解决方案2】:

    最好的办法是创建两个通过迭代数据来填充的对象。

    上面的答案可能会给出不正确的结果,因为它没有清除列表 x、y 和 z。相反,试试这个:

    const data = [
      {
        "Employee Number": 138,
        "English Competency": "No",
        "Portfolio Lead": "x",
        "Maths Competency": "No"
      },
      {
        "Employee Number": 1385,
        "English Competency": "yes",
        "Portfolio Lead": "x",
        "Maths Competency": "yes"
      },
      {
        "Employee Number": 1318,
        "English Competency": "yes",
        "Portfolio Lead": "y",
        "Maths Competency": "No"
      },
      {
        "Employee Number": 1388,
        "English Competency": "No",
        "Portfolio Lead": "y",
        "Maths Competency": "yes"
      },
      {
        "Employee Number": 1388,
        "English Competency": "No",
        "Portfolio Lead": "z",
        "Maths Competency": "no"
      }
    ];
    
    // Create empty objects to count results in
    const English = {}
    const Maths = {}
    
    // Iterate over each data entry
    for (let entry of data) {
      // Load properties into convenient variable names
      id = entry["Employee Number"]
      english = entry["English Competency"]
      lead = entry["Portfolio Lead"]
      math = entry["Maths Competency"]
    
      // Create empty list for English and Maths objects if key not present
      if (!English[lead]) {
        English[lead] = []
      }
      if(!Maths[lead]) {
        Math[lead] = []
      }
    
      // Add employee to lists based on competency and lead
      if (english == "yes") {
        English[lead].push(id)
      }
      if (math == "yes") {
        Math[lead].push(id)
      }
    }
    
    // Display results for English
    console.log("Project Lead: | English Competency:")
    for (let [lead, emps] of Object.entries(English)) {
      console.log(lead, "       ",emps.length)
    }
    // Display results for Maths
    console.log("Project Lead: | Maths Competency:")
    for (let [lead, emps] of Object.entries(Math)) {
      console.log(lead, "       ",emps.length)
    }
    

    【讨论】:

      【解决方案3】:

      使用过滤器和应用映射进行转换的简单解决方案:

      function getAllInCompetentEmployeesInEnglish(){
      
      var data = [{
          "Employee Number": 138,
          "English Competency": "No",
          "Portfolio Lead": "x",
          "Maths Competency": "No"
        },
        {
          "Employee Number": 1385,
          "English Competency": "yes",
          "Portfolio Lead": "x",
          "Maths Competency": "yes"
        },
        {
          "Employee Number": 1318,
          "English Competency": "yes",
          "Portfolio Lead": "y",
          "Maths Competency": "No"
        },
        {
          "Employee Number": 1388,
          "English Competency": "No",
          "Portfolio Lead": "y",
          "Maths Competency": "yes"
        },
        {
          "Employee Number": 1388,
          "English Competency": "No",
          "Portfolio Lead": "z",
          "Maths Competency": "no"
        }];
      
      
        return data.filter(item =>{
              return item['English Competency'] === 'No' ? item : false
            }).
                        map((item) => {
                          return {
                            ['English Competency']:item['English Competency'],
                            ['Portfolio Lead']: item['Portfolio Lead']
                          }
                        });     
      }   
      
      var employeesList = getAllInCompetentEmployeesInEnglish();
      console.log(employeesList);
      
      

      【讨论】:

        猜你喜欢
        • 2019-08-06
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        相关资源
        最近更新 更多