对象功能正在剥离重复值

时间:2017-10-16 19:12:37

标签: javascript

我正在运行此函数来为chartJS构建一个对象数组:

//create object from item verts
function creatVerticalObj(arr) {
  var verticalObj = {};
  for (var i = 0, j = arr.length; i < j; i++) {
    verticalObj[arr[i]] = (verticalObj[arr[i]] || 0) + 1;
  }
  return verticalObj;
}

var getLabels = Object.keys(creatVerticalObj(itemFilters));
var getColorValues = Object.keys(creatVerticalObj(itemColor));
var getValues = Object.values(creatVerticalObj(itemCount));

然后在chartJS中我运行数据:

data: {
  datasets: [{
    data: getValues,
    backgroundColor: getColorValues,
  }],
  labels: getLabels
},

我知道我输入函数的数组中包含相同数量的项目。每个都有19个......但它实际上只构建了7个对象。

我知道有很多值是重复的(它们是数字)。我在想,如果它们是重复的,我的逻辑就是删除值......我需要解决这个问题。

2 个答案:

答案 0 :(得分:1)

您的阵列是否具有不同的值?您正在使用数组的值作为键来构建新对象,因此如果它们没有不同的值,您最终会破坏这些键。

for (var i = 0, j = arr.length; i < j; i++) {
    verticalObj[arr[i]] = (verticalObj[arr[i]] || 0) + 1;
}

例如,如果你的数组= [1,2,1,2],第一次迭代将设置verticalObj [1] = 2,第二次通过verticalObj [2] = 2,第三次通过verticalObj [1] ] = 2.最后,你最终得到的对象如下:

{
   1: 2,
   2: 3
}

我认为你想要的是:

for (var i = 0; i < arr.length; i++) {
    verticalObj[i] = (arr[i] || 0) + 1;
}

(因为你没有使用j变量,所以在你的for循环中摆脱了额外的混乱。)

答案 1 :(得分:0)

您的代码会将重复值放入计数中,因此如果您有7个值,它应该如下所示:

{
  1: 3,
  2: 5,
  3: 5,
  4: 1,
  5: 1,
  6: 1,
  7: 3
}

右边的数字应该与你输入值的数量相加(你所说的数字是19)。

如果这不是您想要的行为,给出示例输入和输出会很有帮助。