Итерируйте и группируйте объекты, используя функцию карты - PullRequest
0 голосов
/ 26 декабря 2018

Проверьте десятичный идентификатор и сгруппируйте их соответствующим образом.

Ниже приведены пример и рекомендуемые значения JSON

Пример JSON

{
    "results": [
        {
            "name": "Download",
            "id": "1.1.1"
        },
        {
            "name": "Download",
            "id": "1.2"
        },
        {
            "name": "Download",
            "id": "1.3.2"
        },
        {
            "name": "Download",
            "id": "2"
        },
        {
            "name": "Download",
            "id": "2.3"
        },
        {
            "name": "Download",
            "id": "3.2"
        },
        {
            "name": "Download",
            "id": "3.5"
        },
        {
            "name": "Download",
            "id": "4.2"
        }
    ]
}

Хотелось бы повторить и реструктурировать вышеуказанный JSON в ниже рекомендуемый формат.

Логика: Следует проверить идентификатор (с десятичными знаками и без) и сгруппировать их на основеномер.

Например:

1, 1.1, 1.2.3, 1.4.5 => data1: [{id: 1},{id: 1.1}....] 
2, 2.3, 2.3.4 => data2: [{id: 2},{id: 2.3}....]
3, 3.1 => data3: [{id: 3},{id: 3.1}]

Рекомендуется JSON

{
    "results": [
        {
            "data1": [
                {
                    "name": "Download",
                    "id": "1.1.1"
                },
                {
                    "name": "Download",
                    "id": "1.2"
                },
                {
                    "name": "Download",
                    "id": "1.3.2"
                }
            ]
        },
        {
            "data2": [
                {
                    "name": "Download",
                    "id": "2"
                },
                {
                    "name": "Download",
                    "id": "2.3"
                }
            ]
        },
        {
            "data3": [
                {
                    "name": "Download",
                    "id": "3.2"
                },
                {
                    "name": "Download",
                    "id": "3.5"
                }
            ]
        },
        {
            "data4": [
                {
                    "name": "Download",
                    "id": "4.2"
                }
            ]
        }
    ]
}

Я пробовал следующее решениено он не группирует объект

var formatedJSON = [];
results.map(function(d,i) {
    formatedJSON.push({
        [data+i]: d
    })
});

Заранее спасибо.

Ответы [ 5 ]

0 голосов
/ 26 декабря 2018

Одно решение с RegEx для более точного управления, так как оно будет легко различать от 1 до 11. Кроме того, это гарантирует, что даже если одна и та же версия выйдет в конце (скажем, 1.9 в конце), она вернет ее обратно в data1.

let newArr2 = ({ results }) =>
  results.reduce((acc, item) => {
    let key = "data" + /^(\d+)\.?.*/.exec(item.id)[1];
    let found = acc.find(i => key in i);
    found ? found[key].push(item) : acc.push({ [key]: [item] });
    return acc;
  }, []);
0 голосов
/ 26 декабря 2018

let input = getInput();

let output = input.reduce((acc, curr)=>{
  let {id} = curr;
  let majorVersion = 'name' + id.split('.')[0];
  if(!acc[majorVersion]) acc[majorVersion]= [];
  acc[majorVersion].push(curr);
  return acc;
},{})
  
console.log(output)
  
  
  
function getInput(){
  return [
  {
      "name": "Download",
      "id": "1.1.1"
  },
  {
      "name": "Download",
      "id": "1.2"
  },
  {
      "name": "Download",
      "id": "1.3.2"
  },
  {
      "name": "Download",
      "id": "2"
  },
  {
      "name": "Download",
      "id": "2.3"
  },
  {
      "name": "Download",
      "id": "3.2"
  },
  {
      "name": "Download",
      "id": "3.5"
  },
  {
      "name": "Download",
      "id": "4.2"
  }

  ]
  }
0 голосов
/ 26 декабря 2018

Вы можете использовать reduce, как это.Идея состоит в том, чтобы создать пару ключ-значение для каждого data1, data2 и т. Д., Чтобы значения в этом объекте были значениями, которые вам нужны в конечном массиве.Затем используйте Object.values, чтобы получить их в виде массива.

const sampleJson = {"results":[{"name":"Download","id":"1.1.1"},{"name":"Download","id":"1.2"},{"name":"Download","id":"1.3.2"},{"name":"Download","id":"2"},{"name":"Download","id":"2.3"},{"name":"Download","id":"3.2"},{"name":"Download","id":"3.5"},{"name":"Download","id":"4.2"}]}

const grouped = sampleJson.results.reduce((a, v) => {
    const key = `data${parseInt(v.id)}`;
    (a[key] = a[key] || {[key]: []})[key].push(v);
    return a;
},{});

console.log({results: Object.values(grouped)})

Один лайнер / Code-golf:

let s={"results":[{"name":"Download","id":"1.1.1"},{"name":"Download","id":"1.2"},{"name":"Download","id":"1.3.2"},{"name":"Download","id":"2"},{"name":"Download","id":"2.3"},{"name":"Download","id":"3.2"},{"name":"Download","id":"3.5"},{"name":"Download","id":"4.2"}]},k;

console.log({results:Object.values(s.results.reduce((a,v)=>(k=`data${parseInt(v.id)}`,(a[k] = a[k]||{[k]:[]})[k].push(v),a),{}))})
0 голосов
/ 26 декабря 2018

Вот как вы это сделаете:

var data = {
    "results": [
        {
            "name": "Download",
            "id": "1.1.1"
        },
        {
            "name": "Download",
            "id": "1.2"
        },
        {
            "name": "Download",
            "id": "1.3.2"
        },
        {
            "name": "Download",
            "id": "2"
        },
        {
            "name": "Download",
            "id": "2.3"
        },
        {
            "name": "Download",
            "id": "3.2"
        },
        {
            "name": "Download",
            "id": "3.5"
        },
        {
            "name": "Download",
            "id": "4.2"
        }
    ]
};

var newData = {
  "results": {}
};

data.results.forEach(item => {
  var num = item.id.slice(0, 1);
  if (newData.results["data" + num]) {
    newData.results["data" + num].push(item);
  } else {
    newData.results["data" + num] = [item];
  }
})

data = newData;
console.log(data);

Что он делает, он перебирает каждый элемент в results, получает номер перед id этого элемента и проверяет, является ли массив имениdata-{num} существует.Если массив существует, он выдвигается.Если он не существует, он создается с помощью элемента.

0 голосов
/ 26 декабря 2018

Вот, пожалуйста:

var data = {
    "results": [
        {
            "name": "Download",
            "id": "1.1.1"
        },
        {
            "name": "Download",
            "id": "1.2"
        },
        {
            "name": "Download",
            "id": "1.3.2"
        },
        {
            "name": "Download",
            "id": "2"
        },
        {
            "name": "Download",
            "id": "2.3"
        },
        {
            "name": "Download",
            "id": "3.2"
        },
        {
            "name": "Download",
            "id": "3.5"
        },
        {
            "name": "Download",
            "id": "4.2"
        }
    ]
};


let newSet = new Set();

data.results.forEach(e => {
  let key = e.id.substring(0, e.id.indexOf('.'));
  console.log(key);
  if (newSet.has(key) == false) {
    newSet.add(key);
    newSet[key] = [];
    }
   newSet[key].push(e.id);
});


console.log(newSet);
...