3

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
 }
 ]
 }
]
asked Oct 12, 2020 at 8:51

2 Answers 2

4

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);

answered Oct 12, 2020 at 8:58
Sign up to request clarification or add additional context in comments.

Comments

3

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; }

answered Oct 12, 2020 at 8:56

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.