Сортировка массивов по первому параметру в JS - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь организовать данные после того, как они были зациклены и объединены.

Отредактировано: показать реализацию конечной части

const request = require('request');




const options = {
    url: 'https://stockx.com/api/browse?&_search=$jordan 3 unc',
    method: 'GET',
    headers: {
        'Accept': 'application/json',
        'Accept-Charset': 'utf-8',
        'User-Agent': 'stockx'
    }
};

request(options, function(err, res, data) {
    const json = JSON.parse(data);

    console.log(json.Products[0].shoe)
    console.log(json.Products[1].media.imageUrl)

    for (var n = 1; n < 25; n++){





/* ^ loop through array and then reorganize and join them below */

    const sizes = [json.Products[n].market.lastSaleSize];
    const sales = [json.Products[n].market.lastSale];


    const join = sizes.concat(sales);



    v






Проблема в том, что [размер: продажа] возвращается, но все размеры не в порядке, есть ли функция sort (), которая может изменить порядок размеры в числовом порядке, но с сохранением продажной цены?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Функция сортировки по умолчанию сравнивает значения в виде строк. Чтобы правильно отсортировать [цена: продажа], вам нужно привести цену к числу, прежде чем делать сравнение. Тогда функция сортировки для вашей задачи выглядит следующим образом:

yourResult.sort((tupleA, tupleB) => Number(tupleA[0]) - Number(tupleB[0]))

Проблема с вашим кодом состоит в том, что структура данных, с которой вы работаете, представляет собой массив из двух элементов. Эти элементы могут быть доступны только по индексу. arr[0] или arr[1].

Ответьте на свой вопрос ниже:

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

Текущее решение, которое у вас есть сейчас, похоже на смесь копировальных паст. Позвольте мне объяснить вам, как бы я решил эту проблему:

  1. Ваши данные:
const json = JSON.parse(data);
Поскольку в lastSale есть пустые значения, давайте избавимся от этих продуктов с помощью фильтра:
const filteredProducts = json.Products.filter(function(product) {
        return product.market.lastSaleSize !== null &&
               product.market.lastSale !== null
      })

Подробнее о фильтре: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Для всех продуктов вам нужны lastSaleSize и lastSale. Хорошей структурой данных для этого будет массив с объектами этого формата:
{ lastSaleSize: X, lastSale: Y }

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

const sales = filteredProducts.map(function(product) {
        return {
            lastSaleSize: product.market.lastSaleSize,
            lastSale: product.market.lastSale,
        }
    })

Подробнее о функции карты: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Последний шаг - сортировка. Каждый предмет продажи теперь является объектом с ключами lastSaleSize и lastSale. Следовательно, можно получить доступ к lastSaleSize с помощью оператора точки (.lastSaleSize). Поскольку lastSaleSize по-прежнему является строкой, требуется приведение к числу.
const result = sales.sort(function(saleA, saleB) {
    return Number(saleA.lastSaleSize) - Number(saleB.lastSaleSize)
})
0 голосов
/ 06 апреля 2020

Решение, которое вам было дано, является самым простым способом.

array.sort(function(a,b){
  return parseFloat(a[0]) - parseFloat(b[0])
})

Однако я создал функцию, которая будет сортировать ваш массив по первому значению каждого массива в основном массиве массивов

function sort_array_by_first_value(array){

  sorted_array = []  //the new array where will will store the sorted values

  while(array.length > 0){
    //getting an array with the first value in every single of the arrays (eg : [6, 6.5, 5.5])
    array_of_first_values = array.map(obj=>parseFloat(obj[0]))
    //getting the index of the biggest value
    highest_value_index = array_of_first_values.indexOf(Math.max.apply(Math,array_of_first_values))
    //pushing the array with the highest value in the first position to our new array, sorted_array
    sorted_array.push(array[highest_value_index])
    //taking away from original array the array pushed to the new one
    array.splice(highest_value_index,1)

  }
  console.log(sorted_array)
  return sorted_array
}

var array =
[[ '6', 235 ],
[ '6.5', 240 ],
[ '5.5', 217 ],
[ '9.5', 249 ],
[ '5', 216 ],
[ '8.5', 230 ],
[ '7', 245 ],
[ '11', 277 ],
[ '4', 210 ],
[ '9', 238 ],
[ '10', 238 ]]


sort_array_by_first_value(array)

Я надеюсь, вы найдете это полезным

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