Алгоритм агрегации для упорядочения массива в определенной последовательности c - PullRequest
1 голос
/ 18 апреля 2020

https://pastebin.com/s3NsNzNL

Мне нужно объединить json выше примерно так:

[
{
    columns : ["Color","Model","Miles"],
    combination : ["Black","Subaru","More than 1000"],
    count : 1
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Black","Subaru","More than 2000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Black","Subaru", "More than 3000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Black","Toyota", "More than 1000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Black","Toyota", "More than 2000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Black","Toyota", "More than 3000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Yellow","Subaru", "More than 1000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Yellow","Subaru", "More than 2000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Yellow","Subaru", "More than 3000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Yellow","Toyota", "More than 1000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Yellow","Toyota", "More than 2000"],
    count : 2
},
{
    columns : ["Color","Model","Miles"],
    combination : ["Yellow","Toyota", "More than 3000"],
    count : 2
}
]

Пример изображения
создать функцию, которая будет принимать несколько имен полей и объединяться в нечто вроде выше.

например.

as per example above is based on this selection
     fields= ["Color","Model","Miles"] <-- this should be flexible, it could be ["Color","Miles"]

    function aggregate(fields,json){
        //Algorithm starts?
        fields.forEach()
        json.forEach() ??
        ..............
    }

Кто-нибудь знает эффективный способ решить эту проблему? Любая помощь будет высоко ценится! scala или javascript в порядке

отредактировано: если кто-то, возможно, все еще не понимает вопрос, я, в основном, хочу собрать список объектов JSON, как указано выше, с использованием функции, которая принимает список полей, например, ["Color", "Model"] (может быть больше 2), также с 'Count' этой комбинации.

Основой c logi c каждого агрегированного объекта является

если выбраны поля Цвет и Модель

val combination = jsonObjectList
   .filter( e => (e.name == "Color" || e.name == "Model") && (e.value.contains("Black") || e.value.contains("Toyota") ))

new AggregatedObj(fields= Seq("Color","Model"), combination = Seq("Black","Toyota"), count = combination.length)

без использования сторонних библиотек

фиктивные данные = https://pastebin.com/s3NsNzNL

Пример изображения

Ответы [ 2 ]

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

Вы можете взять объект для обращения к тем же группам и получить значения из объекта.

var data = [{ model: "LaCrosse", car_year: 2010, buyer_gender: "Male", country: "Philippines", color: "Red" }, { model: "Caliber", car_year: 2008, buyer_gender: "Male", country: "Portugal", color: "Khaki" }, { model: "MX-6", car_year: 1988, buyer_gender: "Female", country: "Ukraine", color: "Orange" }, { model: "Blazer", car_year: 1995, buyer_gender: "Male", country: "Poland", color: "Mauv" }, { model: "Patriot", car_year: 2010, buyer_gender: "Male", country: "Portugal", color: "Orange" }, { model: "Lancer", car_year: 2008, buyer_gender: "Female", country: "Philippines", color: "Puce" }, { model: "LS", car_year: 2001, buyer_gender: "Female", country: "Dominican Republic", color: "Red" }, { model: "Econoline E250", car_year: 1992, buyer_gender: "Male", country: "Nigeria", color: "Indigo" }, { model: "QX", car_year: 2007, buyer_gender: "Female", country: "Ethiopia", color: "Goldenrod" }, { model: "E250", car_year: 2005, buyer_gender: "Male", country: "Japan", color: "Aquamarine" }, { model: "S80", car_year: 2009, buyer_gender: "Male", country: "Sierra Leone", color: "Pink" }, { model: "Element", car_year: 2004, buyer_gender: "Female", country: "Colombia", color: "Teal" }, { model: "Town Car", car_year: 2009, buyer_gender: "Female", country: "China", color: "Aquamarine" }, { model: "Escalade ESV", car_year: 2012, buyer_gender: "Female", country: "Portugal", color: "Violet" }, { model: "Jetta", car_year: 1996, buyer_gender: "Female", country: "Indonesia", color: "Puce" }],
    columns = ['model', 'car_year', 'color'],
    grouped = Object.values(data.reduce((r, o) => {
        const
            combination = columns.map(k => o[k]),
            key = combination.join('|');
        if (!r[key]) r[key] = { columns, combination, count: 0 };
        r[key].count++;
        return r;
    }, {}));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 19 апреля 2020

для тех, кто хочет получить ответ для scala версии

case class GroupedData( combinations: Combinations,jsonData: JsonData)
case class Combinations( columns : Seq[String])
case class JsonData(data : Seq[js.Dynamic])

def count(jsonData: JsonData) : Double = jsonData.data.length

def groupJson(gColumn : Seq[String],gJson : JsonData) ={
  gJson.data.map { obj =>
    obj.entity_combinations = gColumn.map(obj.selectDynamic(_)).mkString("|")
    obj
  }.groupBy(_.entity_combinations).map {
    case(combinations,objs)=>
      GroupedData(
        Combinations(combinations.toString.split("\\|")),
        JsonData(objs)
      )
  }.toSeq
}

grouped foreach { e=> js.Dynamic.global.console.log(e.combinations.columns.toJSArray, count(e.jsonData))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...