Как я могу получить индекс отсортированного списка, в котором изменяется элемент?

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть следующий массив, и я хочу получить индекс исходного (отсортированного) массива, в котором меняется элемент, и как часто этот отдельный элемент существует.

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

Желаемый результат должен быть таким:

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

Большое вам спасибо за любое предложение.

Приветствия.

Комментарии:

1. Как? Можете ли вы объяснить шаблон?

2. Почему 0 в ac ? Будет ли это тогда иметь место для каждого массива, имеющего хотя бы одно значение?

3. Первый элемент ac всегда будет равен 0, поскольку при индексе 0 (первый элемент массива) появляется новое значение. Он существует в массиве 3 раза, следовательно, первое значение ad равно 3.

Ответ №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 и выполните итерацию, значением под ключом является массив, возьмите размер и добавьте к новому массиву, чтобы вы могли создать ad = [3,2,5,2]

снова выполните итерацию по ключам и получите https://underscorejs.org/#indexOf , вы можете сконструировать ac = [0,3,5,10]

поиграйте с этими методами, ознакомьтесь с примерами, и вы сможете сделать это сами!

Ответ №5:

Я думаю, что это работает в R. YMMV
> ab = c (1,1,1,3,3,5,5,5,5,6,6)
> i1<-1: длина (ab)
> i2<-c (2: длина (ab), length(ab))
> i3<-ab[i1]!=ab [i2]
> ac <-c (0,i1 [i3])
> ac
[ 1] 0 3 5 10
> ad<-c(ac[-1],длина(ab))-ac
> ad
[1] 3 2 5 2

Комментарии:

1. Отвечать на вопрос двухлетней давности принятым ответом и публиковать только код — не лучший способ продемонстрировать ваше решение. Если вы добавите некоторые пояснения, это, вероятно, будет лучшим ответом

2. @Steve Что еще можно сказать?