Сортировать и объединить массив - PullRequest
0 голосов
/ 24 января 2019

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

function merge(a, b, n, m)  
{  
    res = []; 
    i = 0; j = 0; k = 0;  
    while(i < n && j < m) {
        if(a[i]['created'] < b[j]['created']) {
            res.push(a[i]);
            i++;
        } else {
            res.push(b[j]);
            j++;
        }        
    }

    while(i < n) {
        res.push(a[i]);
        i++;
    }

    while(j < m) {
        res.push(b[j]);
        j++;
    }
    return res;  
}  

a = [{'title':'title1', 'created':'18'},{'title':'title2', 'created':'16'},{'title':'title3', 'created':'20'}];  
b = [{'title':'title4','created':'17'},{'title':'title5','created':'19'}];  
n = a.length;  
m = b.length;  

var endResult = merge(a, b, n, m);  
console.log(endResult);

Мой ожидаемый результат должен быть следующим:

[{'title':'title2', 'created':'16'},{'title':'title4','created':'17'},{'title':'title1', 'created':'18'},{'title':'title5','created':'19'},{'title':'title3', 'created':'20'}];

Пожалуйста, дайте мне знать, что я пропустил здесь.

Примечание: я не хочу использовать встроенную функцию Javascript, такую ​​как sort ().Я должен отсортировать значения на основе конкретной бизнес-логики, которую я реализую после выяснения базовой сортировки.

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Это очень легко сделать с помощью встроенных функций sort и concat.

Пользовательская логика может быть предоставлена ​​функции сравнения.Трудно представить какую-либо требуемую сортировку, которая не может быть выполнена таким образом.

// `comparator` contains your custom business logic.  Return a negative number if `a`
// is smaller than `b`, a positive one if it's larger, and 0 if they're equal.

const mergeAndSort = (comparator) => (a, b) => a.concat(b).sort(comparator)

const myComparator = (a, b) => {
  return Number(a.created) - Number(b.created)  // or just `a.created - `b.created`
}

const a = [{ title: 'title1', created: '18' }, { title: 'title2', created: '16' }, { title: 'title3', created: '20' }],
      b = [{ title: 'title4', created: '17' }, { title: 'title5', created: '19'}]

console.log(mergeAndSort(myComparator)(a, b))

Это попытка научиться писать алгоритм сортировки?Если нет, то я бы пошел с таким подходом.

0 голосов
/ 24 января 2019

Простое решение O (n ^ 2) состояло бы в том, чтобы перебрать все элементы в поисках наименьшего значения, затем повторить их все снова, отыскивая второе наименьшее значение и т. Д.

function mergeSort(a, b) {
    var array = a.concat(b);
    var length = array.length;
    var results = [];
    while(results.length < length) {
	var currentLowest = 0;
	for(var i = 1; i < array.length; i++) {
	    if(array[i].created < array[currentLowest].created) {
		currentLowest = i;
	    }
	}
	results.push(array[currentLowest]);
	array.splice(currentLowest,1);
    }
    return results;
}

a = [{'title':'title1', 'created':'18'},{'title':'title2', 'created':'16'},{'title':'title3', 'created':'20'}];  
b = [{'title':'title4','created':'17'},{'title':'title5','created':'19'}];

var endResult = mergeSort(a,b);
document.getElementsByTagName('p')[0].innerHTML = JSON.stringify(endResult);
<p></p>
0 голосов
/ 24 января 2019

Кажется, это работает хорошо, хотя я не могу говорить о его скорости.

  const arr1 = [111,2,300,50,6,71,9];
  const arr2 = [122,8,40,29,611,74,1];
  // Combines the two arrays into one
  const unsorted = arr1.concat(arr2);
  const sorted = [];

  for(i = 0; i < unsorted.length; i++){
    // Adds all elements from the unsorted array to the destination (sorted) array
    insert(unsorted[i], sorted);
  }
  console.log(sorted);

  function insert(item, arr){
    // Adds the first item automatically
    if(arr.length == 0){
      arr.push(item); 
      return; 
    }
    for(let i = 0; i < arr.length; i++){
      if(i + 1 == arr.length){
        // Adds the item at the end of the array because it's so big 
        arr.push(item);
        break;
      }

      else if(item < arr[i]){
        // Adds the item at the appropriate position in the sorted array
        arr.splice(i, 0, item);
        break;
      }
    }
  }
0 голосов
/ 24 января 2019

Вы можете взять вложенный цикл и отсортировать массив после concat.

function sort(array) {
    var sorted = [],
        i = array.length,
        j;

    while (i--) {
        for (j = 0; j < sorted.length; j++) {
            if (array[i].created < sorted[j].created) {
                break;
            }
        }
        sorted.splice(j, 0, array[i]);
    }
    return sorted;
}

var a = [{ title: 'title1', created: '18' }, { title: 'title2', created: '16' }, { title: 'title3', created: '20' }],
    b = [{ title: 'title4', created: '17' }, { title: 'title5', created: '19'}],
    result = sort(a.concat(b));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...