将对象数组映射到两个数组的更好方法,一个是唯一键,另一个是出现的数组

时间:2017-10-03 19:37:37

标签: javascript arrays

我有一个对象数组,我正在努力想出一个更好的方法将它映射到两个新数组:一个包含一个唯一代码值列表,另一个包含一个出现的计数每个代码。

注意:结果数组的顺序很重要。例如,data [1]应该是标签出现的次数[1]。

这是我到目前为止所做的,但我似乎无法在没有多个循环的情况下找到方法...



var objs = [{
    code: 200,
    message: 'a'
  },
  {
    code: 300,
    message: 'b'
  },
  {
    code: 200,
    message: 'c'
  },
  {
    code: 400,
    message: 'd'
  },
  {
    code: 200,
    message: 'e'
  },
];

var data = [];
var labels = [];

var bins = objs
  .reduce((codes, obj) => {
    let key = obj.code;
    codes[key] ? codes[key]++ : codes[key] = 1;
    return codes;
  }, {});

for (var prop in bins) {
  if (!bins.hasOwnProperty(prop))
    continue;

  labels.push(prop);
  data.push(bins[prop]);
}

console.log('data', data);      // [3, 1, 1]
console.log('labels', labels);  // ['200', '300', '400']




4 个答案:

答案 0 :(得分:1)

使用更新版本的Javascript更干净一点,但应该是相同的。看看吧。

const objs = [{
    code: 200,
    message: 'a'
  },
  {
    code: 300,
    message: 'b'
  },
  {
    code: 200,
    message: 'c'
  },
  {
    code: 400,
    message: 'd'
  },
  {
    code: 200,
    message: 'e'
  },
];

const data = [];
const labels = [];

objs.forEach(obj => {
  if (labels.indexOf(obj.code) < 0) {
  	labels.push(obj.code);
    data.push(1);
  } else {
  	const index = labels.indexOf(obj.code);
    data[index] ++;
  }
});

console.log('data', data);
console.log('labels', labels);

答案 1 :(得分:1)

您可以为索引更新数组使用哈希表。

var values = [{ code: 200, message: 'a' }, { code: 300, message: 'b' }, { code: 200, message: 'c' }, { code: 400, message: 'd' }, { code: 200, message: 'e' }],
    hash = Object.create(null),
    data = [],
    label = [];

values.forEach(function (o) {
    if (o.code in hash) {
        data[hash[o.code]] += 1;
        return;
    }
    hash[o.code] = data.push(1) - 1;
    label.push(o.code);
});

console.log(data);
console.log(label);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

这看起来像你想要一个像数组一样的对象并且可以具有键值。 我建议使用地图

看看这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

通过这个你可以用一个循环来实现这个并获得你需要的正确结果

答案 3 :(得分:1)

You can use reduce将对象数组转换为Map,然后提取{{ 3}}和values到数组:

&#13;
&#13;
const values = [{ code: 200, message: 'a' }, { code: 300, message: 'b' }, { code: 200, message: 'c' }, { code: 400, message: 'd' }, { code: 200, message: 'e' }];

const counts = values.reduce((m, { code }) => m.set(code, (m.get(code) || 0) + 1), new Map());

const data = [...counts.values()];
const label = [...counts.keys()];

console.log(data);
console.log(label);
&#13;
&#13;
&#13;