Как бы вы искали имя свойства и меняли (удаляли) его, когда находили в массиве массивов? - PullRequest
3 голосов
/ 06 ноября 2019

Например, это массив массивов, который у меня есть

arr: [ 
[
    {
      type: "some type",
      name: "some name"
    }, 
    {
      type: "some type",
      name: "some name"
    }
],
[
    {
      type: "some type",
      name: "some name"
    }, 
    {
      type: "some type",
      name: "some name",
      customAttr: "something custom"
    }
],
[
    {
      type: "some type",
      name: "some name"
    }, 
    {
      type: "some type",
      name: "some name"
    },
   customAttr: "something custom"
]];

, который я хочу удалить или изменить, когда customAttr найден в этом массиве массивов. Его можно найти в слое Array, слое Objects или даже глубже. Кроме того, я не хочу переходить от индекса 0, но после него.

Я пробовал это

arr.forEach(e => e).filter(s => s.customAttr) 

, но он попадает только на один слой, и я хочу мутировать массив

Есть ли функция, даже в Lodash, которая может быть использована для этого?

Спасибо.

1 Ответ

2 голосов
/ 06 ноября 2019

Если вы имеете право на плоский массив, то, возможно, это для вас:

const arr = [
  [
      {
        type: "some type1",
        name: "some name"
      },
      {
        type: "some type2",
        name: "some name"
      }
  ],
  [
      {
        type: "some type3",
        name: "some name"
      },
      {
        type: "some type4",
        name: "some name",
        customAttr: "something custom"
      }
  ],
  [
      {
        type: "some type5",
        name: "some name"
      },
      {
        type: "some type6",
        name: "some name"
      },
      customAttr= "something custom1"
  ]
];



const flatArray = (arr) => {
  return arr.reduce(function (flat, toFlatten) {
    return flat.concat(Array.isArray(toFlatten) ? flatArray(toFlatten) : toFlatten);
  }, []);
  }

const flattened = flatArray(arr);
const result = flattened.filter(fi => fi.type && fi.name ).map(f=> {  
  return {
    type: f.type,
    name: f.name
  }
});
console.log(result);

ОБНОВЛЕНИЕ:

В случае избежания сплющивания массива, вы можете сделать следующее (будьте осторожны, он будет работать простодля двумерного массива):

const testArray = [
  [
  {
    type: "some type1",
    name: "some name"
  },
  {
    type: "some type2",
    name: "some name"
  }
  ],
  [
  {
    type: "some type3",
    name: "some name"
  },
  {
    type: "some type4",
    name: "some name",
    customAttr: "something custom"
  }
  ],
  [
  {
    type: "some type5",
    name: "some name"
  },
  {
    type: "some type6",
    name: "some name"
  },
  customAttr= "something custom1"
  ]
];

const beautifyArray = (srcArray) => {
  srcArray.forEach((el, i) => {
el = el.filter(fi=> fi.type && fi.name)
       .map(a => { return { type: a.type, name: a.name}});
testArray[i] = el;
  });
  console.log(testArray);
}

beautifyArray(testArray)
...