Zadanie polega na wycięciu zagnieżdżonej tablicy za pomocą właściwości data. Mam następującą strukturę tablicy:

  const mockData = [
    {
      text: 'Text1',
      data: [
        { field: '1' },
        { field: '2' },
        { field: '3' },
        { field: '4' },
        { field: '5' },
        { field: '6' }
      ]
    },
    {
      text: 'Text2',
      data: [{ field: '1' }, { field: '2' }, { field: '3' }, { field: '4' }]
    }
  ];

Oto metoda, której używam:

const sliceArray = mockData => mockData.map(d => ({...d, data: d.data.slice(0, 3)}))

Przechodzi przez wszystkie obiekty zagnieżdżone i tablicę wycinków według właściwości data, ale jak mogę to zrobić dla konkretnego obiektu zagnieżdżonego zamiast wszystkich? Chciałbym użyć właściwości text jako klucza.

Tak więc, jeśli przekażę Text1 do metody - właściwość data tylko w pierwszym obiekcie powinna zostać podzielona na plasterki, a wynik powinien wyglądać następująco:

 const mockData = [
    {
      text: 'Text1',
      data: [{ field: '1' }, { field: '2' }, { field: '3' }]
    },
    {
      text: 'Text2',
      data: [{ field: '1' }, { field: '2' }, { field: '3' }, { field: '4' }]
    }
  ];

Jeśli zdam „Text2”:

 const mockData = [
    {
      text: 'Text1',
       data: [
        { field: '1' },
        { field: '2' },
        { field: '3' },
        { field: '4' },
        { field: '5' },
        { field: '6' }
      ]
    },
    {
      text: 'Text2',
      data: [{ field: '1' }, { field: '2' }, { field: '3' }]
    }
  ];

Jakie może być rozwiązanie? Dziękuję Ci!

0
lecham 1 kwiecień 2020, 19:27

3 odpowiedzi

Najlepsza odpowiedź

Możesz po prostu dodać kolejny parametr do swojej funkcji i sprawdzić, czy tekst pasuje do tego parametru.

 const mockData = [{"text":"Text1","data":[{"field":"1"},{"field":"2"},{"field":"3"},{"field":"4"},{"field":"5"},{"field":"6"}]},{"text":"Text2","data":[{"field":"1"},{"field":"2"},{"field":"3"},{"field":"4"}]}]

const sliceArray = (data, target, len = 3) => 
  data.map(({ text, data, ...rest}) => ({
    data: text == target ? data.slice(0, len) : data,
    text,
    ...rest
  }))

console.log(sliceArray(mockData, 'Text1'))

Możesz również przekazać tablicę wartości tekstowych, które chcesz dopasować, i użyć metody includes do sprawdzenia.

 const mockData = [{"text":"Text1","data":[{"field":"1"},{"field":"2"},{"field":"3"},{"field":"4"},{"field":"5"},{"field":"6"}]},{"text":"Text2","data":[{"field":"1"},{"field":"2"},{"field":"3"},{"field":"4"}]}, {"text":"Text3","data":[{"field":"1"},{"field":"2"},{"field":"3"},{"field":"4"},{"field":"5"},{"field":"6"}]}]

const sliceArray = (data, targets, len = 3) => 
  data.map(({ text, data, ...rest}) => ({
    data: targets.includes(text) ? data.slice(0, len) : data,
    text,
    ...rest
  }))

console.log(sliceArray(mockData, ['Text1', 'Text3']))
2
Nenad Vracar 1 kwiecień 2020, 16:32

Możesz spróbować dodać taki warunek:

const sliceArray = (mockData, text) => 
                     mockData.map(d => d.text === text 
                        ? {...d, data: d.data.slice(0, 3)} 
                        : d)
3
CD.. 1 kwiecień 2020, 16:32

Jeśli nie chcesz modyfikować istniejących danych, ponieważ kpisz. użyj zmniejsz

const mockData = [
  {
    text: "Text1",
    data: [
      { field: "1" },
      { field: "2" },
      { field: "3" },
      { field: "4" },
      { field: "5" },
      { field: "6" }
    ]
  },
  {
    text: "Text2",
    data: [{ field: "1" }, { field: "2" }, { field: "3" }, { field: "4" }]
  }
];

function update(data, text, count = 3) {
  return data.reduce((arr, item) => {
    let updatedItem = { ...item };
    if (item.text === text) {
      updatedItem.data = (updatedItem.data || []).slice(0, count);
    }
    arr.push(updatedItem);
    return arr;
  }, []);
}

console.log("%j", update(mockData, "Text1"));
.as-console-row {color: blue!important}
1
xdeepakv 1 kwiecień 2020, 16:32