mr.StandAloneZ
mr.StandAloneZ

Reputation: 63

JS How to remove object in multi demension array?

I have array like this


let quotes = [
  {
    quoteNumber :'001',
    items : [
       {
         partnumber : '5551',
         supplierQty : 0,
         stock : 5
       },
      {
         partnumber : '5552',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  },
  {
    quoteNumber : '002',
    items : [
       {
         partnumber : '5554',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5552',
         supplierQty : 5,
         stock : 0
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  },
  {
    quoteNumber : '003',
    items : [
       {
         partnumber : '5554',
         supplierQty : 0,
         stock : 1
       },
      {
         partnumber : '5552',
         supplierQty : 0,
         stock : 3
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  }
]

the result that I want is remove items inside quote that has supplierQty === 0 and remove quote that every items in it has supplierQty === 0

this is the result that I want.


let quotes = [
  {
    quoteNumber :'001',
    items : [
       
      {
         partnumber : '5552',
         supplierQty : 1,
         stock : 0
       }
    ]
  },
  {
    quoteNumber : '002',
    items : [
       {
         partnumber : '5554',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5552',
         supplierQty : 5,
         stock : 0
       }
    ]
  }
]


this is my code


let results = quotes.filter((quote , index) => {
  
   let filterQuote = quote.items.filter((item) => {
       return item.supplierQty > 0; 
    })
   
   return filterQuote.length > 0;
  
})
                   

console.log(results);

but It just remove quote 003 only . It didn't remove items inside quote 001 and 002 .

How can I do that . thank for help


results = [
  {
    quoteNumber :'001',
    items : [
       {
         partnumber : '5551',
         supplierQty : 0,
         stock : 5
       },
      {
         partnumber : '5552',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  },
  {
    quoteNumber : '002',
    items : [
       {
         partnumber : '5554',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5552',
         supplierQty : 5,
         stock : 0
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  }
]


Upvotes: 3

Views: 47

Answers (2)

Derek Wang
Derek Wang

Reputation: 10193

You need to filter items first and remove the quote which does not contain any item using Array.filter.

const quotes = [
  {
    quoteNumber :'001',
    items : [
       {
         partnumber : '5551',
         supplierQty : 0,
         stock : 5
       },
      {
         partnumber : '5552',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  },
  {
    quoteNumber : '002',
    items : [
       {
         partnumber : '5554',
         supplierQty : 1,
         stock : 0
       },
      {
         partnumber : '5552',
         supplierQty : 5,
         stock : 0
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  },
  {
    quoteNumber : '003',
    items : [
       {
         partnumber : '5554',
         supplierQty : 0,
         stock : 1
       },
      {
         partnumber : '5552',
         supplierQty : 0,
         stock : 3
       },
      {
         partnumber : '5553',
         supplierQty : 0,
         stock : 2
       }
    ]
  }
];

const results = quotes.map(({ items, ...quote }) => ({
  ...quote,
  items: items.filter(({ supplierQty }) => supplierQty > 0)
})).filter(({ items }) => items.length > 0);

console.log(results);

Upvotes: 4

Nina Scholz
Nina Scholz

Reputation: 386560

You need to reduce the array and filter only the inner part and add a new array if the length of the inner filtering is greater than zero.

let quotes = [{ quoteNumber: '001', items: [{ partnumber: '5551', supplierQty: 0, stock: 5 }, { partnumber: '5552', supplierQty: 1, stock: 0 }, { partnumber: '5553', supplierQty: 0, stock: 2 }] }, { quoteNumber: '002', items: [{ partnumber: '5554', supplierQty: 1, stock: 0 }, { partnumber: '5552', supplierQty: 5, stock: 0 }, { partnumber: '5553', supplierQty: 0, stock: 2 }] }, { quoteNumber: '003', items: [{ partnumber: '5554', supplierQty: 0, stock: 1 }, { partnumber: '5552', supplierQty: 0, stock: 3 }, { partnumber: '5553', supplierQty: 0, stock: 2 }] }],
    result = quotes.reduce((r, { items, ...o }) => {
        items = items.filter(({ supplierQty }) => supplierQty);
        if (items.length) r.push({ ...o, items });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 3

Related Questions