获取匹配字符串的所有数组/映射条目

时间:2018-05-02 12:59:00

标签: arrays angular typescript

我使用两个已关联值的数组,这意味着arrayX[1]arrayY[1]相关联,arrayX[2]arrayY[2]相关联等等。

我现在需要过滤那个arrayX,以匹配或包含给定值,并且只覆盖arrayX filtered和匹配的arrayY。

我尝试使用键值创建一个数组/地图,我发现此链接Take object out of array based on attribute value ,然后使用'.find'进行过滤,但我无法获得预期结果。

我找到了此链接Take object out of array based on attribute value

当我调用函数来过滤我传递一个值时,例如我传递一个字符串'2010'

  • 我的arrayX有:

    (10)[“2008年12月”,“2010年2月”,“2010年4月”,“2010年7月”,“2010年12月”,“2011年2月”,“2012年4月”,“2013年7月”,“2014年3月“,”2017年5月“]

  • 我的数组有:

    (10)[1,7,4,1,10,11,4,8,7,10]

所以,对于我需要的输出

arrayX["Feb 2010", "Apr 2010", "Jul 2010", "Dec 2010"]和

arraY[7, 4, 1, 10]

我需要值和过滤器的打字稿代码是:

filtr(dt){
      console.log(dt);
      console.log(this.arrayX);
      console.log(this.arrayY);

      //Array contains x and y values at the correct position
      let array = [
          {y: this.Yvalues, x: this.Xvalues}
      ];

      let item : any = array.find(i => i.x.find(dt));

      //new filtered x and y values on array 
      console.log(item)
}

我无法弄清楚我将如何做到这一点...我认为关键 - >价值是一个很好的解决方案,但我甚至没有输出.. 对不起,如果我错过了一些简单的事情......

2 个答案:

答案 0 :(得分:2)

您可以使用array#reduce并检查当前日期字符串中是否存在提供的值。然后将对应于该索引的日期和值从另一个数组添加到结果数组中。



const arrayX = ["Dec 2008", "Feb 2010", "Apr 2010", "Jul 2010", "Dec 2010", "Feb 2011", "Apr 2012", "Jul 2013", "Mar 2014", "May 2017"],
      arrayY = [1, 7, 4, 1, 10, 11, 4, 8, 7, 10],
      year = 2010,
      result = arrayX.reduce((r, date, i) => {
        if(date.includes(year)){
          r.push({x: date, y: arrayY[i]})
        }
        return r;
      },[]);
console.log(result);




要分别获取X和Y值,例如,为了图表,只需映射结果并迭代它,就像这样。

let x = result.map(({x}) => x);
let y = result.map(({y}) => y);

答案 1 :(得分:1)

请参阅下面的代码段。 您可以使用返回的结果,例如:result.newArrayXresult.newArrayY。这样您还可以保持原始阵列的安全。

arrayX =  ["Dec 2008", "Feb 2010", "Apr 2010", "Jul 2010", "Dec 2010", "Feb 2011", "Apr 2012", "Jul 2013", "Mar 2014", "May 2017"];

    arrayY =  [1, 7, 4, 1, 10, 11, 4, 8, 7, 10];

    function filterFunc(filterYear) {

        return this.arrayX.reduce((acc, elem) => {
                if (elem.split(' ')[1] == filterYear) {
                    acc.newArrayX.push(elem);
                    acc.newArrayY.push(this.arrayY[this.arrayX.indexOf(elem)])
                }
                return acc;
            },{newArrayX: [], newArrayY: []}
        );
    }

    result = this.filterFunc('2010');
    console.log(result);