如何从数组中获取该数组元素的最后n个元素

时间:2017-11-06 02:01:26

标签: javascript arrays

我正在使用angular4,我在尝试在视图中显示数组的某些元素时遇到了很多麻烦。 我懂了 enter image description here

元素的数量可以根据当前月份而变化,因此如果是2月,则数组中只有M01和M02。 我一直试图将它循环到for循环但我似乎无法正确。 关于如何做的任何想法?

我想得到这样的东西,所有的值都以单个属性中的“M”开头

[0:  M: [...]
     cod_item:...
     cod_condominio:...
...
]

如果它是一个数组或对象并不重要,只要我可以循环该元素以在我的视图中显示它。

5 个答案:

答案 0 :(得分:1)

您可以使用嵌套循环来检查当前属性是以"M"开头,将属性,值设置为对象,将对象推送到数组

const arr = [{M01:1, M02:2, M03:3, A:4, B:5}, {M04:6, M05:7}];

let res = [];

let match = "M";

for (let o of Object.values(arr)) {
  const curr = {};
  for (let [key, prop, [k] = key] of Object.entries(o)) {
    if (k === match) {
       curr[key] = prop;
    }
  }
  res.push(curr);
}

console.log(res);

答案 1 :(得分:1)

如果您只想要以" M"开头的属性,您可以使用 reduce 循环遍历所有对象并仅收集这些元素:



// data
var arr = [{}, {
  M0:'foo',
  M1:'bar',
  M2:'fum',
  blah:'blah'
  }, {
  M0:'foo',
  blah:'blah',
  gee:'gee'
  }
];

// Build an array of objects only containing
// properties starting with "M" followed by digits
var result = arr.reduce(function(acc, obj) {
  var o = {};

  // Loop over object keys
  Object.keys(obj).forEach(function(key){

    // Collect those matching the required pattern
    if (/^M\d+$/.test(key)) {
      o[key] = obj[key];
    }
  });

  // If found some properties, push into accumulator
  if (Object.keys(o).length) acc.push(o);

  return acc;
}, []);

// Show results
console.log(result)

// Concise
var r = arr.reduce((acc, obj) => {
  var o = {};
  Object.keys(obj).forEach(key => {
    if (/^M\d+$/.test(key)) o[key] = obj[key];
  });
  if (Object.keys(o).length) acc.push(o);
  return acc;
}, []);

console.log(r)




答案 2 :(得分:0)

以下解决方案是新手的做法。但这将是技术债务。

下面的代码段会根据当前月份为您提供一系列元素。

var d = new Date();
var n = d.getMonth();

a =[]
for(i=1;i<=n;i++){
a.push('M'+('0'+(i).toString()).slice(-2))
}
console.log(a)

在角度模板中循环对象时检查数组中是否存在键

答案 3 :(得分:0)

如果您有权访问后端,最好的选择是更改后端的响应,在前端重构响应并不是一个好主意。因此,如果您有权访问,只需更改响应即可将您需要的项目放在单独的列表中。

但是如果您使用第三方并且无法访问后端代码,则可以使用类似这样的内容来获取以“M”开头的项目值:

var a = [
 {
   "M01": 1,
   "M02": 2,
   "code": 44
 },
 {
   "M01": 13,
   "M02": 4,
   "code": 3
 },{
   "M01": 4,
   "M02": 21,
   "code": 11
 }
]

 var t = [];

 for(var i in a){
    for(var j in a[i]){
         if (j[0]=="M") t.push(a[i][j])
     }  
 console.log(t);// it will only have values of items which start with "M"
}

https://jsfiddle.net/f772o781/1/

答案 4 :(得分:0)

const matchStr = (str) => {
  const matchArr = str.match(/^M(\d\d)/i);
  if (matchArr) return +matchArr[1];
  return 0;
}

const extractor = (month) => (dataArr) => {
  return dataArr.map((data) => {
    const tempObj = {};
    const keys = Object.keys(data);
    keys.forEach((key) => {
      if (matchStr(key) && matchStr(key) > month) return;
      tempObj[key] = data[key];
    });
    return tempObj
  });
}

const yourData = [{
    M01: '35238',
    M02: '123121',
    M03: '132222',
    cod_item: '1',
    filtro: 'saldo'
  },
  {
    M01: '35238',
    M02: '123121',
    M03: '132222',
    cod_item: '1',
    filtro: 'saldo'
  },
  {
    M01: '35238',
    M02: '123121',
    M03: '132222',
    cod_item: '1',
    filtro: 'saldo'
  }
];

console.log(extractor(2)(yourData));