首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于值绑定填充数组

基于值绑定填充数组
EN

Stack Overflow用户
提问于 2017-02-02 04:12:12
回答 3查看 48关注 0票数 1

我需要创建一个基于一个人的“年龄”的数据数组。这种带状结构不是线性的,而是像这样分组的

1,2,3,4,5,6,7,8,9,10,11-15,16-20,21-30,31-50,51+

因此,对于任何一组数据,我都需要遍历这些数据,并将其放入适当的年龄“桶”中。

在循环的最后,我想看看每个带中有多少人。

现在,我已经使用了非常粗糙的技术来做到这一点(也就是如果..然后..。否则..。) ;),但是我想知道我是否可以学习新的技术,以及是否有任何库或函数可以接受范围并相应地填充存储桶

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-02 04:39:13

这就是我要做的:

代码语言:javascript
复制
let buckets = '1,2,3,4,5,6,7,8,9,10,11-15,16-20,21-30,31-50,51+'.split(','),
    bucketByAge = {}; // our bucket-age connector where we search later on

// prepare the index
buckets.forEach(function(bucket, index) {
  // get the range (+ will be replaced with 1000; for the age it is infinity)
  // and transform them to numbers
  let range = bucket.replace('+', '-1000').split('-').map(Number);

  // if it was not a range, simulate one
  range[1] = range[1] || range[0];

  // go through the range and fill our connector
  while (range[0] <= range[1]--) {
    bucketByAge[range[1]] = index;
  }
});

// search
function getBucket(age) {
  return { age: age, bucketRange: buckets[bucketByAge[age]], bucketIndex: bucketByAge[age] };
}

console.log(getBucket(1));
console.log(getBucket(12));
console.log(getBucket(61));

这里的好处是:您只需构建一次索引,然后获取结果即可。非常好的表现。

票数 3
EN

Stack Overflow用户

发布于 2017-02-02 04:23:37

一个非常粗糙的o(n^2)实现

代码语言:javascript
复制
const buckets = [
  {
    lowerLim: 1,
    upperLim: 1,
    persons: 0
  },
  {
    lowerLim: 2,
    upperLim: 2,
    persons: 0
  },
  {
    lowerLim: 3,
    upperLim: 5,
    persons: 0
  },
  {
    lowerLim: 6,
    upperLim: 10,
    persons: 0
  },
  {
    lowerLim: 11,
    persons: 0
  }
];


const persons = [{name: 'john', age: 1},{name: 'john', age: 2}, {name: 'john', age: 6}, {name: 'john', age: 20}, {name: 'john', age: 40}, {name: 'john', age: 7}, {name: 'john', age: 1}];

persons.forEach(person => {
  buckets.forEach(bucket => {
    const age = person.age;
    const bucketLowerLimit = bucket.lowerLim;
    const bucketUpperLimit = bucket.upperLim || Number.MAX_SAFE_INTEGER;

    if(age >= bucketLowerLimit && age <= bucketUpperLimit) {
      bucket.persons++;
    }
  })
});


buckets.forEach(bucket => {
  console.log(bucket.persons);
});

票数 0
EN

Stack Overflow用户

发布于 2017-02-02 04:36:34

您可以对inbetween中的所有值和单独的最后一个值使用引用。

代码语言:javascript
复制
var slots = '1,2,3,4,5,6,7,8,9,10,11-15,16-20,21-30,31-50,51+'.split(','),
    last = slots.pop(),
    reference = Object.create(null),
    histogram = Object.create(null),
    i, value;

slots.forEach(function (a) {
    var temp = a.split('-'),
        left = temp[0],
        right = temp[1] || temp[0];

    histogram[a] = 0;
    reference[right] = a;
    while (left < right) {
        reference[left] = a;
        left++;
    }
});

histogram[last] = 0;

for (i = 0; i < 1000000; i++) {
    value = Math.floor(Math.random() * 100);
    histogram[reference[value] || last]++;
}

console.log(histogram);
console.log(reference);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41988824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档