【问题标题】:How can I get index of sorted list where element changes?如何获取元素更改的排序列表的索引?
【发布时间】:2019-03-07 17:23:27
【问题描述】:

我有以下数组,我正在寻找元素正在更改的原始(排序)数组的索引以及单个元素存在的频率。

ab = [1,1,1,3,3,5,5,5,5,5,6,6]

期望的结果应该是这样的:

ac = [0,3,5,10]
ad = [3,2,5,2]

非常感谢您的任何建议。

干杯。

【问题讨论】:

  • 怎么样?你能解释一下这个模式吗?
  • ac 中为什么是 0?那么对于每个具有至少一个值的数组来说,情况会是这样吗?
  • ac 的第一个元素将始终为 0,因为在索引 0(数组的第一个元素)处会出现一个新值。它在数组中存在 3 次,因此 ad 的第一个值设置为 3。

标签: javascript arrays


【解决方案1】:

您可以迭代数组并检查前任。如果相等,则增加最后一个计数,否则将索引和计数相加。

var array = [1, 1, 1, 3, 3, 5, 5, 5, 5, 5, 6, 6],
    { indices, counts } = array.reduce((r, v, i, a) => {
        if (a[i - 1] === v) {
            r.counts[r.counts.length - 1]++;
        } else {
            r.indices.push(i);
            r.counts.push(1);
        }
        return r;
    }, { indices: [], counts: [] });

console.log(...indices);
console.log(...counts);

【讨论】:

    【解决方案2】:

    此代码产生与您发布的类似的输出:

    var ab = [1,1,1,3,3,5,5,5,5,5,6,6];
    
    var ac = Array.from(new Set(ab.map((e) => ab.indexOf(e))));
    
    var ad = [];
    
    for (var i = 0; i < ac.length - 1; i++) {
      ad.push(ac[i + 1] - ac[i]);
    }
    ad.push(ab.length - ac[ac.length - 1]);
    
    console.log(...ab);
    console.log(...ac);
    console.log(...ad);

    【讨论】:

      【解决方案3】:

      试试这个,应该会得到你想要的

              ab = [1,1,1,3,3,5,5,5,5,5,6,6];
      
              var items = [];
              var positions = [];
              var count = [];
      
              ab.map((item, index)=>{
      
                  //check if exist
                  let item_index = items.indexOf(item);
                  if(item_index == -1) {
                      items.push(item);
                      positions.push(index);
                      count.push(1);
                  } else {
                      let current_count = count[item_index];
                      count[item_index] = ++current_count;
                  }
              });
      
              console.log(positions);
              console.log(count);
      

      【讨论】:

        【解决方案4】:

        所以,使用https://underscorejs.org/#groupBy 您可以按值分组

        _.groupBy([1,1,1,3,3,5,5,5,5,5,6,6]);
        
        or 
        
        _.groupBy([1,1,1,3,3,5,5,5,5,5,6,6], function(num){ return num; })
        

        你会得到一个类似的对象

        {1: [1,1,1], 3: [3,3], 5: [5,5,5,5,5], 6: [6,6]}
        

        所以如果你把所有https://underscorejs.org/#keys遍历一遍,key下的值就是数组,取大小并追加到新数组,这样你就可以使ad = [3,2,5,2]

        再次,遍历keys得到https://underscorejs.org/#indexOf,可以构造ac = [0,3,5,10]

        玩转这些方法,查看示例,你自己就能搞定!

        【讨论】:

          【解决方案5】:

          我认为这适用于 R. YMMV
          > ab = c(1,1,1,3,3,5,5,5,5,5,6,6)
          > i1> i2> i3> ac> 交流
          [1] 0 3 5 10
          > ad> 广告
          [1] 3 2 5 2

          【讨论】:

          • 用可接受的答案回答一个两年前的问题并仅发布代码并不是展示您的解决方案的好方法。如果您添加一些解释,这可能是一个更好的答案
          • @Steve 还有什么要说的?
          猜你喜欢
          • 1970-01-01
          • 2013-12-03
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          • 2019-05-01
          • 2020-01-20
          • 1970-01-01
          • 2017-04-18
          相关资源
          最近更新 更多