如何过滤和计算 javascript 数组中的对象?

埃莱加利

我正在尝试在一个数组上实现filter方法,其中每个元素都是这样的对象:

{
  "start": 1234,
  "end": 4321,
  "count": 0
}

我想在增加count属性的同时从我的数组中删除重复项

目前,我只能start使用以下代码属性过滤数组

 var temp = {};
 myArray = myArray.filter(function(obj) {
     if (obj.start in temp) {
         return false;
     } else {
         temp[obj.start] = true;
         return true;
     }
 }); 

我想要实现的是在这些条件下工作的过滤器(为了更好地解释,我将引用tempas 中的元素tempObj和当前对象 as obj):

  • 如果obj.start=== tempObj.start&& obj.end=== tempObj.end, obj.count+= 1
  • 如果obj.start=== tempObj.start|| obj.end=== tempObj.end, obj.count= tempObj.count+ 1
  • 如果obj.start> tempObj.start&& obj.end< tempObj.end, obj.count= tempObj.count+ 1
  • else 添加一个新元素到tempwith count= 1

是否可以使用过滤方法?如果不是,正确的方法是什么?我宁愿不使用任何框架。

编辑:根据 RobG 的请求,为了使问题更清楚,我添加了一个输入和输出示例。

示例输入:

myArray = [{
  "start": 1105,
  "end": 1501,
  "count": 0
},

{
  "start": 1105,
  "end": 1003,
  "count": 0
},

{
  "start": 1110,
  "end": 1120,
  "count": 0
},

{
  "start": 1105,
  "end": 1003,
  "count": 0
},

{
  "start": 1115,
  "end": 1120,
  "count": 0
}]

期望的输出:

myArray = [{
  "start": 1105,
  "end": 1501,
  "count": 1
},

{
  "start": 1105,
  "end": 1003,
  "count": 3
},

{
  "start": 1110,
  "end": 1120,
  "count": 1
}

{
  "start": 1115,
  "end": 1120,
  "count": 1
}]
瑞克

这是你想要的?

myArray = [{
    "start": 1105,
    "end": 1501,
    "count": 0
  },

  {
    "start": 1105,
    "end": 1003,
    "count": 0
  },

  {
    "start": 1110,
    "end": 1120,
    "count": 0
  },

  {
    "start": 1105,
    "end": 1003,
    "count": 0
  },

  {
    "start": 1115,
    "end": 1120,
    "count": 0
  }
]





var obj = {};

for (var i = 0, len = myArray.length; i < len; i++) {
  obj[myArray[i]['start']] = myArray[i];
}

myArray = new Array();
var count = 0;
for (var key in obj) {
  obj[key].count = count++;
  myArray.push(obj[key]);
}



console.log(myArray)

更新的答案。

myArray = [{
    "start": 1105,
    "end": 1501,
    "count": 0
  },

  {
    "start": 1105,
    "end": 1003,
    "count": 0
  },
  {
    "start": 1105,
    "end": 1003,
    "count": 0
  },

  {
    "start": 1110,
    "end": 1120,
    "count": 0
  },

  {
    "start": 1105,
    "end": 1003,
    "count": 0
  },

  {
    "start": 1115,
    "end": 1120,
    "count": 0
  }
]


function removeDoopCount(myArray) {
  const start = x => myArray[x].start;
  const end = x => myArray[x].end;
  let hash = new Map();
  for (var i = 0, len = myArray.length; i < len; i++) {
    let key = start(i) + ':' + end(i);
    let item = myArray[i];
    let values = hash.get(key);
    if (values) values.push(item);
    else hash.set(key, [item]);
  }
  let ar = [];
  hash.forEach((v, k, m) => (count = 1, v.forEach(i => i.count += count++), ar.push(v[v.length - 1])));
  return ar;
}
console.log(removeDoopCount(myArray));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章