如何将.reduce函数生成的数组操作为单独的键/值对?(JavaScript)

How to manipulate an array generated from .reduce function into separate key/value pairs? (JavaScript)

本文关键字:单独 值对 JavaScript 操作 reduce 函数 数组      更新时间:2023-09-26

我正在努力解决我遇到的一个问题。reduce;

目前,我正在迭代一个数组来计算重复的数量,如下所示;

var data = ['141:150.5', '141:150.5', '141:150.5', '224:297.5','83:351.5','278:434.5','332:182', '332:182','263:135','256:155','256:155','105:65']
var reducer = function(tally, vote) {
  if(!tally[vote]){
    tally[vote] = 1
  } else {
    tally[vote] = tally[vote] + 1;
  }
  
  return tally;
}
var result = data.reduce(reducer, {});
console.log(result)

我想做的是将该数组中每个项的输出拆分为一个具有3个键/值对的对象。

因此,从上面("141:150.5": 3)的输出中获得第一个结果,我想生成以下内容;

{ 
value1: 141,
value2: 150.5,
count: 3
},

等等。

然而,由于上面的函数没有输出数组长度,这意味着我无法通过result进行迭代来开始构建所需的对象。

我在这里有点迷路了——任何帮助/建议都将不胜感激!

如前所述,您只需要拆分key值并进行相应的处理。

此外,我还利用空闲时间更新了您的reduce函数。

var data = ['141:150.5', '141:150.5', '141:150.5', '224:297.5', '83:351.5', '278:434.5', '332:182', '332:182', '263:135', '256:155', '256:155', '105:65']
var reducer = function(tally, vote) {
  tally[vote] = (tally[vote] || 0) + 1;
  return tally;
}
var result = data.reduce(reducer, {});
var output = [];
for(var k in result){
  var _t = k.split(":");
  output.push({
    value1: _t[0],
    value2: _t[1],
    count: result[k]
  });
}
console.log(output)

你也可以更新你的reduce函数,直接给出输出,比如:

var data = ['141:150.5', '141:150.5', '141:150.5', '224:297.5', '83:351.5', '278:434.5', '332:182', '332:182', '263:135', '256:155', '256:155', '105:65']
var count = 1;
var reducer = function(p, c, i, a) {
  if (p && p !== c) {
    var _t = p.split(":");
    result.push({
      value1: _t[0],
      value2: _t[1],
      count: count
    });
    count = 1;
    if (i === a.length - 1) {
      _t = c.split(":");
      result.push({
        value1: _t[0],
        value2: _t[1],
        count: count
      });
    }
  } else {
    count++;
  }
  return c
}
var result = [];
data.sort().reduce(reducer);
console.log(result)

您可以简单地使用for在循环中迭代对象,并使用.split(':'):通过:分割密钥

var data = ['141:150.5', '141:150.5', '141:150.5', '224:297.5', '83:351.5', '278:434.5', '332:182', '332:182', '263:135', '256:155', '256:155', '105:65']
var reducer = function(tally, vote) {
  if (!tally[vote]) {
    tally[vote] = 1
  } else {
    tally[vote] = tally[vote] + 1;
  }
  return tally;
}
var result = data.reduce(reducer, {});
for (const key in result) {
  const value = key.split(':')
  result[key] = {value1: value[0], value2: value[1], count: result[key]}
}
console.log(result)

您已经完成了部分任务。

var data = ['141:150.5', '141:150.5', '141:150.5', '224:297.5', '83:351.5', '278:434.5', '332:182', '332:182', '263:135', '256:155', '256:155', '105:65']
var reducer = function (tally, vote) {
    if (!tally[vote]) {
        tally[vote] = 1
    } else {
        tally[vote] = tally[vote] + 1;
    }
    return tally;
}
var result = data.reduce(reducer, {});
var result2 = [];
for (key in result) {
    var a = {};
    a.value1 = Number(key.split(":")[0]);
    a.value2 = Number(key.split(":")[1]);
    a.count = result[key];
    result2.push(a);
}
console.log(result2);

var m = [];
_.forEach(result,function(value,key){
         let k = key.split(':');
         m.push({value1:parseInt(k[0]),value2:parseInt(k[1]),count:value});
});
console.log(m)

这是你正在寻找的作品的剧本。它利用了Lodash。祝你今天过得愉快!!!

Object.keys( result ).length将为您提供键的数量

Just try the below code:

var data = ['141:150.5', '141:150.5', '141:150.5', '224:297.5', '83:351.5', '278:434.5', '332:182', '332:182', '263:135', '256:155', '256:155', '105:65']
var reducer = function(tally, vote) {
  if (!tally[vote]) {
    tally[vote] = 1
  } else {
    tally[vote] = tally[vote] + 1;
  }
  return tally;
}
var result = data.reduce(reducer, {});
console.log(result);
var resultArr = [];
for(var key in result) {
    var obj = {};
  var splitArr = key.split(":");
  obj.value1 = splitArr[0];
  obj.value2 = splitArr[1];
  obj.count = result[key];
  resultArr.push(obj);
}
console.log(resultArr);
Now if you want to access data you can try like this:
console.log(resultArr[0].value1);
console.log(resultArr[0].value2);
console.log(resultArr[0].count);

如果我没有误解你想做什么,你可以通过在中使用for来迭代你的"结果"对象

for (var prop in result) {
    if (result.hasOwnProperty(prop )) {
        var val = result[prop];
        // then output your desired format
    }
}