Выбор значения из таблицы

 
0
 
JavaScript
ava
Vardoulacha | 19.03.2013, 08:43
Порылся в интернете, но не нашел решения, может у кого есть готовое решение, чтобы не изобретать велосипед.

Есть таблица в екселе
столбцы ширина и строки Высота


      2250      2375      2500
2085  531       563       565
2210  550       583       595
2335  566       600       624


2250 2375 2500 - это ширина
2085 2210 2335 - это высота
остальное это цены

имеем на входе любые значения высоты и ширины, нужно найти какая ячейка с ценой соответствует этим параметрам
Kommentare (9)
ava
Aliance | 19.03.2013, 10:22 #
Как Excel связан с JS?
ava
Vardoulacha | 19.03.2013, 10:32 #
Цитата (Aliance @  19.3.2013,  10:22 findReferencedText)
Как Excel связан с JS? 

Никак не связан, данные просто начальные там есть. их надо будет перенести в JS в какую-нибудь структуру, может в объект может в массив (вариантов несколько), а потом надо как-то использовать эту информацию чтобы получить нужные данные.

Пока что придумал только такое решение
1) засовываем высоту в массив ID1 = значение
2) ширину в другой массив ID2 = значение
3) третий массив состоит из ключей ID1+ID2 (перечисление всех возможных вариантов) и значения которое должно быть
4) затем получим на входе ширину и высоту находим ID1 и ID2 складываем их и ищем есть ли такая пара в массиве значений, если есть то показываем значение, если нет методом округлений подгоняем результат под существующие значения

понятно что костыль, вот и спрашиваю может кто такое уже делал, если нет сам сделаю через это костыль
ava
Aliance | 19.03.2013, 12:16 #
Если абстрагироваться от задачи переноса данных из Excel`я, то задача сводится к понятию двумерного ассоциативного массива (в js это просто двумерный объект):


var data = {
   2250: {
      2085: 531,
      2210: 550,
      2335: 566
   },
   2375: {
      2085: 563,
      2210: 583,
      2335: 600
   },
   2500: {
      2085: 565,
      2210: 595,
      2335: 624
   },
};

alert( data[2375][2335] ); // выведет 600
ava
Vardoulacha | 20.03.2013, 08:51 #
Цитата (Aliance @  19.3.2013,  12:16 findReferencedText)
Если абстрагироваться от задачи переноса данных из Excel`я, то задача сводится к понятию двумерного ассоциативного массива (в js это просто двумерный объект):


Ну да, как данные попадут в JS это не вопрос, про двумерный массив я не подумал, удобно, спасибо за наводку
ava
Vardoulacha | 21.03.2013, 10:39 #
Ну вот так вот я решил задачу


// Начальные данные
var prices = {
    2250: {
        2085: 531,
        2210: 550,
        2335: 566,
        2460: 601,
        2585: 616,
        2710: 644,
        2835: 658,
        2960: 678,
        3085: 694
    },
    2375: {
        2085: 563,
        2210: 583,
        2335: 600,
        2460: 626,
        2585: 658,
        2710: 684,
        2835: 704,
        2960: 726,
        3085: 742
    },
    2500: {
        2085: 565,
        2210: 595,
        2335: 624,
        2460: 631,
        2585: 680,
        2710: 706,
        2835: 728,
        2960: 749,
        3085: 769
    },
    2625: {
        2085: 600,
        2210: 622,
        2335: 637,
        2460: 676,
        2585: 701,
        2710: 728,
        2835: 750,
        2960: 770
    }
};

// Находим ширину
var widthMin = 1000000;
var widthMinKey = 0;
for (var keyWidth in prices)
{
    if (Math.abs(keyWidth - calcWidth) < widthMin)
    {
        widthMin = Math.abs(keyWidth - calcWidth);
        widthMinKey = keyWidth;
    }
}

// Находим высоту
var heightMin = 1000000;
var heightMinKey = 0;
for (var keyHeight in prices[widthMinKey])
{
    if (Math.abs(keyHeight - calcHeight) < heightMin)
    {
        heightMin = Math.abs(keyHeight - calcHeight);
        heightMinKey = keyHeight;
    }
}

alert(prices[widthMinKey][heightMinKey]);
ava
Aliance | 21.03.2013, 11:56 #
Что-то не то получилось. Изначалньо была приведена таблица 3х3, где все стороны равны - а значит выбирать для первого и второго уровня массива было все равно какую. Когда стороны не равны - лучше выбирать большую для первого уровня, экономия получится. У тебя наоборот получилось, у тебя 4 элемента первого уровня (2250, 2375, 2500 и 2625), и около 9 элементов второго. Лучше сделать наоборот. НО! Этот совет касается ситуации, когда твои элементы второго уровня были бы идентичны в элементах первого уровня. У тебя я такого не вижу (например, в 2625 нет 3085). Это либо значит что в первом посте ты привел слишком абстрактные данные, либо в полученном коде не проставляешь нули там, где данных нет.

Весь мой пост сводился не к тому, что ты сделал не правильно (работает и хорошо), а к тому, как было бы можно сделать в идеале. Как-то так)
ava
Vardoulacha | 23.03.2013, 06:25 #
Цитата (Aliance @  21.3.2013,  11:56 findReferencedText)
Что-то не то получилось.

В первом посте я для примера сократил таблицу до трех значений, на самом деле это только лишь одна из трех таблиц, вторая раза в три длиннее во втором уровне, а третья в три раза длиннее в первом уровне и в 10 раз длиннее во втором уровне.
ava
Aliance | 25.03.2013, 10:55 #
Тогда есть смысл привести не абстрактные значения, а конкретные. И написать ожидаемые результаты.
ava
Vardoulacha | 25.03.2013, 11:11 #
Цитата (Aliance @  25.3.2013,  10:55 findReferencedText)
Тогда есть смысл привести не абстрактные значения, а конкретные. И написать ожидаемые результаты. 


я уже решил задачу, и привел в решении конкретные значения
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden