检查数组对象是否匹配时获取循环,如果找不到则推入对象

时间:2019-05-09 18:26:51

标签: javascript arrays

这是我的代码:

  function createMatchList(data) {
    var matchArray = [];
      for (var i = 0; i < initialData.length; i++) {
        var listData = cleanData(initialData[i][data]);
        if (matchArray.length) {
          for (var a = 0; a < matchArray.length; a++) {
            if (matchArray[a][data] == listData) {
              matchArray[a].Count = matchArray[a].Count + 1;
            } else {
              // THIS CAUSES LOOP
              matchArray.push({ [data]: listData, "Count": 1 });
            }
          }
        } else {
          matchArray.push({ [data]: listData, "Count": 1 });
        }
      }
    }

从本质上讲,这似乎在找不到匹配对象时起作用,我有一个else将该对象推入数组,这会导致循环。

我不确定为什么会发生这种情况,我完全迷失了。

我有一个初始if/else,以查看数组是否为空,如果为空,则将初始对象推入数组,如果数组不为空,则越过这一点,我使用for循环和if语句有效,但是我的else语句导致循环。如果我将matchArray.push({ [data]: listData, "Count": 1 });从else语句中取出并仅进行console.log记录,它将成功记录initialData的第一个for循环中的每个其他迭代。

只是为了了解其中带有对象的数组的样子:

[
   {
      Date: "27 June 1911", 
      Count: 1
   }
]

我的目标是在数组中搜索匹配的日期,如果有匹配项,请不要推送到数组,而要更新计数。原因是我有一个巨大的原始JSON文件,其中包含重复项,并且我正在尝试创建一个新的数据源,以删除重复项并计算发生的次数。

谢谢

2 个答案:

答案 0 :(得分:1)

性能有多重要,您是否使用> = 2015?如果是这样,您可以改为映射并减少一些代码复杂性,例如this答案:

const counts = new Map([...new Set(a)].map(
    x => [x, a.filter(y => y === x).length]
));

然后获取您将要拨打的电话数:

counts.get(x)

在需要将其存储在与上面概述的对象完全一样的情况下,我会做类似的事情:

let unique = Set(dates);
var matchArray = [];

unique.forEach(function (date) {
    matchArray.push({ 
        "Date": date, 
        "Count": dates.filter(x => x === date).length 
    });
});

答案 1 :(得分:1)

使用SetArray.filter()

[...new Set(dates)].map(date => ({
  date,
  count: dates.filter(currDate => date === currDate).length
}));

注意:按照惯例,对象键应小写,date而不是Date

或者,如果您感到勇敢:

const counts = {};
dates.forEach(date => (counts[date] = (counts[date] || 0) + 1));

const dates = [
  '27 June 1911',
  '27 June 1952',
  '27 March 1911',
  '27 June 1952',
  '24 June 1911',
  '27 June 1952'
];

const datesCount = [...new Set(dates)].map(date => ({
  date,
  count: dates.filter(currDate => date === currDate).length
}));

console.log('datesCount', datesCount);


const counts = {};
dates.forEach(date => (counts[date] = (counts[date] || 0) + 1));

const dateCount2 = Object.entries(counts).map(([date, count]) => ({
  date,
  count
}));

console.log('dateCount2', dateCount2);


// Make unique array of dates.
const datesSet = [...new Set(dates)];

// Count by filtering the array and getting it's length.
const datesCount = datesSet.map(date => ({
  date,
  count: dates.filter(currDate => date === currDate).length
}));