2012-04-09 5 views
4

Я борюсь с проблемой массива, которая, я уверен, была решена раньше. Лучшая аналогия, о которой я могу думать, - это функция сравнения продуктов, в которой выбрано 2-3 продукта, и их характеристики перечислены для сравнения пользователя.Сортировка общего массива атрибутов

У меня есть 2-3 массива характеристик. Массивы могут иметь одинаковые характеристики. Мне нужно отображать таблицу массивов бок о бок, где элементы сортируются по «наиболее распространенным». Итак, если все три массива имеют одинаковую характеристику, это будет наверху. Тогда будут указаны две аналогичные характеристики и т. Д. Если два массива разделяют характеристику, третий массив будет иметь пустую ячейку.

Бэкэнд написан на PHP. Интерфейс - это Javascript. Я использую Underscore для некоторых других функций, поэтому доступны функции массива.

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

+0

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

+0

Как вы получаете данные? Вероятно, сортировка базы данных более уместна. – ajreal

+0

Что вы подразумеваете под «характеристиками» ??? – Baba

ответ

1

Мне удалось найти решение, которое, я думаю, охватывает эту проблему, работая с советом mainegreen в использовании вторичной структуры для записи частоты каждой категории и пользовательской функции сортировки, которая сравнивается с использованием значений этого частотного массива , Пример реализации ниже;

function getCategories(products) { 
var categories = [], frequency = {}; 
for (var i = 0; i < products.length; i++) { 
    for (var c in products[i]) { 
     if (products[i].hasOwnProperty(c)) { 
      if (frequency.hasOwnProperty(c)) { 
       frequency[c]++; 
      } else { 
       categories.push(c); 
       frequency[c] = 1; 
      } 
     } 
    } 
} 
categories.sort(function (a,b) { return frequency[b]-frequency[a]; }); 
return categories; 
} 

Это будет работать с рядом продуктов, как показано ниже;

var products = [ 
    { 
     cat1: 'val1', 
     cat2: 'val1', 
    }, { 
     cat2: 'val2', 
     cat3: 'val2', 
    }, { 
     cat2: 'val3', 
     cat3: 'val3', 
     cat4: 'val3', 
    } 
]; 
0

Если я правильно понимаю, что я не уверен, что делаю, но если вы пытаетесь сортировать элементы в нескольких массивах таким образом, чтобы «характеристики» каждого массива были отсортированы, а наиболее общие из них перечислены в наверху, то не могли бы вы иметь дополнительный массив, который вы используете для реализации общего счетчика характеристик? Таким образом, вы будете проходить через свой первый набор массивов, и по мере нахождения каждой характеристики вы увеличиваете счетчик для этого признака.

Затем, когда вы находитесь в режиме отображения, у вас будет рутинная работа цикла в массиве, которую вы использовали для подсчета признаков?

0

Вы можете объединить array_keys() с продуктами для сравнения, а затем прокрутить ключи (== "характеристики") и классифицировать их, скажем, в три новых массива («общий», «общий», «необычный»).

Имея этот массив, перестройте массивы продуктов, оставляя пустые поля для неиспользуемых ключей.