ОСНОВНАЯ функция массива Javascript, проблема известна, но я не могу понять решение - PullRequest
0 голосов
/ 05 июля 2018

В приведенной ниже функции я пытаюсь получить вывод, похожий на этот:

[[1,1,1,1], [2,2,2], 4,5,10, [20,20], 391, 392 591].

Я вижу, что проблема, которую я внедрил, заключается в том, что я всегда добавляю временный массив нажатием в функции, возвращая, в результате, все отдельные числа, кроме последнего числа в каждой функции, находятся в процессе толкнул в целевой массив с объектом массива также.

Мне кажется, что мне нужна дополнительная проверка состояния, но я не могу найти решение, которое работает.

Любые предложения будут высоко оценены.

const sortme = (unsortedArr)=> {

let tempArr = []; 

let outputArr = []; 

const reorderedArr = unsortedArr.sort((a,b) => a-b); 

reorderedArr.forEach((number, i) => {

    if ((i === 0) || (reorderedArr[i] === reorderedArr[i-1])) {
    tempArr.push(number);  
    }

    else {     
    outputArr.push(tempArr);
    tempArr = [];
    tempArr.push(number); 
}  
})

outputArr.push(tempArr[0]);
    return outputArr; 
}

const unsortedArr = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20]; 

sortme(unsortedArr); 

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Надеюсь, что приведенное ниже довольно просто;

function findSame(pos, sortedArr){
	for(let i =pos; i<sortedArr.length; i++){
		if(sortedArr[i] !== sortedArr[pos]){
			return i
		}
	}
}

function clubSameNumbers(unsortedArr){
	let sortedArr = unsortedArr.sort((a,b)=>a-b) 
	//[ 1, 1, 1, 1, 2, 2, 2, 4, 5, 10, 20, 20, 391, 392, 591 ]
	let result = []	
	for(let i = 0; i < sortedArr.length; i = end){
		let start = i
		var end = findSame(i, sortedArr)
		let arr = sortedArr.slice(i, end)
		arr.length > 1 ? result.push(arr) : result.push(...arr)    		
	}
	return result
}


console.log(clubSameNumbers([1,2,4,591,392,391,2,5,10,2,1,1,1,20,20]))
//[ [ 1, 1, 1, 1 ], [ 2, 2, 2 ], 4, 5, 10, [ 20, 20 ], 391, 392, 591 ]

введите код здесь

0 голосов
/ 05 июля 2018

Это должно сработать (с использованием Reduce):

 
const unsortedArr = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20];

let lastValue = null;
var newArr = unsortedArr.sort((a,b) => a-b).reduce((acc, value) => {

    if (acc.length == 0 || ((acc.length > 0 || !acc[acc.length-1].length) && lastValue !== value)) {
        acc.push(value);
    } else if (acc.length > 0 && lastValue === value) {
        acc[acc.length-1] = (acc[acc.length-1].length ? acc[acc.length-1].concat([value]): [value, value]);
    } 
    
    lastValue = value;
    return acc;
}, []);


console.log(newArr);
0 голосов
/ 05 июля 2018

И еще один подход, просто для удовольствия:

const unsortedArr = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20];

var arr = unsortedArr.sort((a,b) => a-b).reduce((acc, value) => {
    if (acc.length > 0 && acc[acc.length-1].includes(value)) {
        acc[acc.length-1].push(value);
    } else {
        acc.push([value])
    }
    return acc;
}, []).map((v) => v.length > 1 ? v: v[0]);

console.log(arr);
0 голосов
/ 05 июля 2018

я бы сделал дедуплицированную копию и .map(), чтобы преобразовать значения в массивы, содержащие значения из исходного (отсортированного) массива, который вы получаете, используя .forEach:

const unsortedArr = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];

const sortMe = (arr) => {
  arr = arr.sort((a, b) => a - b);
  
  // a short way to dedupe an array
  // results in : 1, 2, 4, 5, 10, 20, 391, 392, 591
  let dedupe = [...new Set(arr)]; 
  let tmpArr;

  return dedupe.map(e => {
    tmpArr = []; // empty tmpArr on each iteration
    
    // for each element of the deduped array, look for matching elements in the original one and push them in the tmpArr
    arr.forEach(a => {
      if (a === e) 
        tmpArr.push(e);
    })
    
    if(tmpArr.length === 1)
      return tmpArr[0]; // in case you have [4] , just return the 4
    else
      return tmpArr; // in case you have [1,1,1,1]
    
    // shorthand for the if/else above
    // return tmpArr.length === 1 ? tmpArr[0] : tmpArr;
  });
}

const result = sortMe(unsortedArr);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...