• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JS - wypelnienie tablicy brakujacymi wartosciami numerycznymi

Mały hosting, OGROMNE możliwości
+1 głos
324 wizyt
pytanie zadane 26 marca 2021 w JavaScript przez yapyap Obywatel (1,730 p.)

Witam, posiadam taką tablice z obiektami

const arr = [
{id:2523,name:'asd'}
{id:2525,name:'asd'}
{id:2526,name:'asd'}
{id:2527,name:'asd'}
{id:2532,name:'asd'}
{id:2533,name:'asd'}
{id:2535,name:'asd'}
] // jest przykladowa, moze zaczynac i konczyc sie na dowolnym id, oraz brakujace id takze mogą byc rozne

Problem w tym że brakuje niektórych id pomiędzy, jaki jest najprostszy sposób aby wypełnić brakujące id? w tych ktorych brakuje string name moze byc pusty

Przyklad rozwiazania na jakim mi zalezy

 

const arr = [
{id:2523,name:'asd'}
{id:2524,name:''}
{id:2525,name:'asd'}
{id:2526,name:'asd'}
{id:2527,name:'asd'}
{id:2528,name:''}
{id:2529,name:''}
{id:2530,name:''}
{id:2531,name:''}
{id:2532,name:'asd'}
{id:2533,name:'asd'}
{id:2534,name:''}
{id:2535,name:'asd'}
]

 

3 odpowiedzi

+2 głosów
odpowiedź 26 marca 2021 przez edutomek Dyskutant (8,380 p.)

Nie jestem pewien, o co chodzi w pytanie (najprostszy sposób? a jakie są kryteria prostoty?), ale można np. tak:

0) Założyć, że id ZAWSZE będą liczbami.
Nie trzeba, ale to upraszcza rozwiązanie.

1) Ustalić, jaki jest najmniejszy id obiektu w tablicy.

2) Analogicznie ustalić, jaki jest największy id obiektu w tablicy.

3) W pętli sprawdzić wszystkie id, poczynając od min+1, na max-1 kończąc.
Jeśli danego id nie ma w tablicy, to dodać do niej brakujący obiekt - i tyle.

Jeśli nie ma wymogu, aby na końcu tablica była posortowana, to zadanie wykonane.

Można się posłużyć funkcjami map, find, reduce, czy filter - wszystkie w standardzie JS.

+2 głosów
odpowiedź 27 marca 2021 przez VBService Ekspert (256,580 p.)
edycja 28 marca 2021 przez VBService

Propozycja  smiley,  (użyłem: array.find(...) )

<pre></pre>
  const pre = document.querySelector('pre');
  const arr = [
    {id:2523,name:'asd'},
    {id:2525,name:'asd'},
    {id:2526,name:'asd'},
    {id:2535,name:'asd'},
    {id:2532,name:'asd'},
    {id:2533,name:'asd'},
    {id:2527,name:'asd'}
  ];


  // ------------------------------------------------------------
  arr.sort((a, b) => a.id - b.id);
  const [start, end] = [arr[0].id + 1, arr[arr.length - 1].id];
  for (let i=start; i<end; ++i) {
    if (! arr.find(elem => elem.id === i)) {
      arr.push({ id: i, name: '' });
    }
  }
  arr.sort((a, b) => a.id - b.id);
  // ------------------------------------------------------------


  let html = JSON.stringify(arr).slice(1).slice(0, -1);
      html = html.replace(/},/g, '},\n').replace(/{/g, '  {');
  pre.innerHTML = `const arr = [\n${html}\n];`;


  /* ... lub ...  :-)
  let html = JSON.stringify(arr).replace('[', '[\n').replace(']', '\n];');
      html = html.replace(/},/g, '},\n').replace(/{/g, '  {');
  pre.innerHTML = `const arr = ${html}`;
  */

[ edit ]

const arr = [
  {id:2523,name:'asd'},
  {id:2525,name:'asd'},
  {id:2526,name:'asd'},
  {id:2535,name:'asd'},
  {id:2532,name:'asd'},
  {id:2533,name:'asd'},
  {id:2527,name:'asd'}
];


// ------------------------------------------------------------
const [start, end] = [ Math.min(...arr.map(({ id }) => id)),
                       Math.max(...arr.map(({ id }) => id)) ];
for (let i=start; i<end; ++i) {
  if (! arr.find(elem => elem.id === i)) {
    arr.push({ id: i, name: '' });
  }
}
arr.sort((a, b) => a.id - b.id);
// ------------------------------------------------------------


let html = JSON.stringify(arr).slice(1).slice(0, -1);
    html = html.replace(/},/g, '},\n').replace(/{/g, '  {');
pre.innerHTML = `const arr = [\n${html}\n];`;

 

komentarz 27 marca 2021 przez maciej.tokarz Nałogowiec (27,260 p.)

Jest różnica smiley

komentarz 28 marca 2021 przez VBService Ekspert (256,580 p.)
edycja 28 marca 2021 przez VBService

No poprawiłem (patrz [ edit ] ) i jest, różnica, i tu   wink

komentarz 30 marca 2021 przez maciej.tokarz Nałogowiec (27,260 p.)

@VBService, jest różnica bo masz inne dane wejściowe devil

+1 głos
odpowiedź 26 marca 2021 przez maciej.tokarz Nałogowiec (27,260 p.)
edycja 26 marca 2021 przez maciej.tokarz

Na przykład tak...

const arr = [
  { id: 2523, name: "asd" },
  { id: 2525, name: "asd" },
  { id: 2526, name: "asd" },
  { id: 2527, name: "asd" },
  { id: 2532, name: "asd" },
  { id: 2644, name: "asd" },
  { id: 2533, name: "asd" }
];

const result = [];
let previousItem = null;

arr.sort((a, b) => a.id - b.id);
arr.forEach((item) => {
  if (previousItem) {
    const diff = item.id - previousItem.id;

    if (diff !== 1) {
      let missingId;

      for (missingId = previousItem.id + 1; missingId < item.id; missingId++) {
        const missingItem = { id: missingId, name: "" };
        result.push(missingItem);
      }
    }
  }

  previousItem = item;
  result.push(item);
});

document.getElementById("app").innerHTML = JSON.stringify(result);

 

Podobne pytania

0 głosów
1 odpowiedź 2,060 wizyt
pytanie zadane 1 września 2017 w JavaScript przez Maciejf Początkujący (470 p.)
0 głosów
3 odpowiedzi 3,896 wizyt
pytanie zadane 23 lipca 2017 w JavaScript przez modest Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 1,055 wizyt

93,719 zapytań

142,632 odpowiedzi

323,264 komentarzy

63,266 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...