这是我的代码: 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循环和语句有效,但是我的else语句导致循环。如果要从else语句中删除该if并仅进行console.log记录,它将成功记录matchArray.push({ [data]: listData, "Count": 1 });的第一个for循环中的每个其他迭代。并给出一个带有对象的数组的外观的想法:[ { Date: "27 June 1911", Count: 1 }]我的目标是在数组中搜索匹配的日期,如果有匹配项,请不要推送到数组,而要更新计数。原因是我有一个巨大的原始JSON文件,其中包含重复项,并且我正在尝试创建一个新的数据源,以删除重复项并计算发生的次数。谢谢 最佳答案 使用Set和Array.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}));关于javascript - 检查数组对象是否匹配时获取循环,如果找不到则推送对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56065511/
10-12 00:03
查看更多