Сортировка объектов 4/5

Вообще легкотня, даже сокращу

const getSortedArray = (array, key) => array.sort((a,b) => a[key] - b[key]);

6 лайков

Мой вариант получился посложнее, но рабочий. Все таки в уроках обучения не было таких командб как “const”, “.sort”.

var getSortedArray = function (mass, key) {
for (var i = 0; i < mass.length - 1; i++) {
for (var j = i + 1; j < mass.length; j++) {
if (mass[i][key] > mass[j][key]) {
var swap = mass[i];
mass[i] = mass[j];
mass[j] = swap;
}
}
}
return mass;
}

2 лайка

Добрый день, вижу Ваши сообщения с кодом почти в каждой задаче. Но Ваш код намного короче остальных, почему? Где почитать про это? И почему в курсе не рассказывают об этом?

2 лайка

почитать можно тут и тут.
не рассказывают видимо по той причине, что JS достаточно сложен, а потому, прежде чтобы осваивать его новый синтаксис, нужно освоить ванильный ну и чтобы вы покупали интенсивы

6 лайков

Просьба подсказать , в контексте работы надо данной задачей обнаружил такое несоотвествие. Касаемо объектов, переменная же должна сохранять только ссылку на объект, В приведенном мной примере переменная change стала независимым объектом. Как так?

var obj = {"name":"Ляксандр","age":"15"};
var copy = obj;
obj = "30";
console.log(copy);
console.log(obj);

Объект существует сам по себе, независимо в какую ячейку памяти вы его определите.
Когда пропадает 1ая ссылка obj (в нее записывается примитив - строка “30”), всё еще остается 2ая ссылка copy и объект все еще доступен по ней.

также и с вашей задачей, есть объект

{ "name": "Василий","age": "6" }

сначала он доступен из массива arr

console.log(arr[0]);

потом ему дают вторую ссылку -

let change = arr[0];

потом затирают 1 элемент массива (с индексом 0) с присвоением ему примитива - число 25:

 arr[0] = 25; // затёрли основную ссылку

тот самый объект с Василием все еще доступен по ссылке change, хотя он исчез из массива arr

т.е. объекты существуют сами по себе, пока есть упоминание на них. как только последняя связь обрывается - сборщик мусора выкидывает его из памяти.

по сути также работают и замыкания, т.к. функция это объект

6 лайков

спасибо, дошло

var getSortedArray = function (arrayOfObjects, key) {
  var swap;
  for (var i = 0; i < arrayOfObjects.length - 1; i ++) {
    
    for (var j = i + 1; j < arrayOfObjects.length; j ++) {
      if (arrayOfObjects[j][key] < arrayOfObjects[i][key]) {
        swap = arrayOfObjects[i];
        arrayOfObjects[i] = arrayOfObjects[j];
        arrayOfObjects[j] = swap;
      }
    }
    
  }
  return (arrayOfObjects);
};

На тот случай если тип значения будет ‘string’, а не ‘number’

typeof
const getSortedArray = function(array, key) {
  return array.sort((a, b) => 
    typeof(a[key]) === 'string' 
      ? a[key].localeCompare(b[key]) 
      : a[key] - b[key] 
  );
}
1 лайк

Объясните, пожалуйста, зачем mass.length - 1
Ведь оно и так работает если не отнимать единицу

чтобы количество итераций уменьшить, потому что самый большой элемент и так помещается в конец, нет смысла его еще раз сравнивать (тем более с undefined, т.к. j будет равно mass.length и такой элемент будет undefined) и упростить сортировку мб. но вообще для сортировки есть метод с колбеком: .sort((a,b) => a[key] - b[key])

Да что вы знаете о решениях посложнее! Вот как я решил эту задачу. Наверное в душе я индус…

var getSortedArray=function(sortArray, keyName){

var age=[];
var min=[];
var end=[];
for(var x=0;x<sortArray.length;x++){
age.push(sortArray[x][keyName]);

}
//переносим ключевые значения в отдельный массив

var min=0;

for(var j=0;j<sortArray.length;j++){
for(var i=0;i<sortArray.length;i++){

if (age[i+1]<age[i]){
min=age[i];
age[i]=age[i+1];
age[i+1]=min;

}

}
//сортируем этот массив
}

for(var z=0;z<sortArray.length;z++){
for(var y=0;y<sortArray.length;y++)
if(sortArray[y]===end[z]){
continue;
}else if(sortArray[z][keyName]===age[y]){
end[y]=sortArray[z];
}
}
//сравниваем ключевые значения со значениями отсортированного//массива, если совпадает, то записываем в новый массив по //индексу. Предварительно вводим проверку на одинаковые //значения.

return end;
}

Красиво написал))))))))))))))

А зачем во 2-ой строчке кода к “mass.length приписывать (- 1)”? Я понимаю что так нужно, но можете пожалуйста объяснить.

Моя уметь цикл и условие. Больше не уметь. Таки придется покупать интенсивы :rofl:

var getSortedArray = function (arr, nameKey) {
  arrValues = [];
  for (var i=0; i<arr.length; i++) {
    arrValues[i] = arr[i][nameKey];
  };
  arrValues.sort(function(a, b) { return a - b; });
  for (var i=0; i<arr.length; i++) {
    for (var j=0; j<arr.length; j++) {
      if (arrValues[i] === arr[j][nameKey]) {
        arrValues[i] = arr[j];
      };
      if (arrValues[i] === arrValues[i-1]) {
        arrValues[i] = arr[j];
      };
    };
  };
  return arrValues;
};

В принципе @Hierumo уже реализовал то же самое (я думал все через стрелочные переделать, но лень)

Давно не спойлер!

function getSortedArray(array, key) {
return array.sort((a, b) => a[key] - b[key]);
}

просто переписываем массив

Сводка
var getSortedArray = function (arr, name){
   for (var i = 0; i < arr.length - 1; i++){
    for (var j = i+1; j < arr.length; j++){
      if (arr[i][name] > arr[j][name]){
        arr.push(arr[i]);
        arr.splice(i,1);
      }      
    }
  }
  return arr;
}
2 лайка
var getSortedArray = function (arrayList, nameKey) {
  
  for (var i = 0; i < arrayList.length - 1; i++) {
    var minValue = arrayList[i];
    
    for (var j = i + 1; j < arrayList.length; j++) {
      if (arrayList[j][nameKey] < arrayList[i][nameKey]) {
        minValue = arrayList[j];
        var replace = arrayList[i];
        arrayList[i] = minValue;
        arrayList[j] = replace;
      }
    }
  }
  
  return arrayList;
}
1 лайк

Я стараюсь выполнять задания только на основе полученных знаний и вот что выходит
var getSortedArray = function(arr, key){
for (var i = 0; i < arr.length - 1; i++){
for (var j = 0; j < arr.length - 1 - i; j++){
if(arr[j + 1][key] < arr[j][key]){
var flag = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = flag;
}
}
}

return arr;
};

1 лайк

Что-то я упустил в каких случаях применяется mass.length - 1, а в каких mass.length?