代码之家  ›  专栏  ›  技术社区  ›  AppRoyale

javascript-获取元素更改的排序列表的索引

  •  1
  • AppRoyale  · 技术社区  · 5 年前

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

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

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

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

    非常感谢你的建议。

    干杯。

    0 回复  |  直到 5 年前
        1
  •  5
  •   Nina Scholz    5 年前

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

    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
  •  2
  •   DjaouadNM    5 年前

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

    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
  •  1
  •   Jonathan K    5 年前

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

            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
  •  1
  •   Dmitri Algazin    5 年前

    所以,使用 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下的值是array,获取size并追加到新数组中,这样就可以使ad=[3,2,5,2]

    再次,遍历键并获取 https://underscorejs.org/#indexOf ,可以构造ac=[0,3,5,10]

    玩这些方法,检查例子,你可以自己做!