1

I'm trying to move objects from one array into seven different arrays. They are all in one array from the start. I want to sort them based on a value from another array that have one attribute that correlates.

Array 1 that I want to sort

var serialList = [
    {
        "OrderNumber": "1",
        "ArticleNumber": "CLIENT",
        "SerialNumber": "111"

    },
    {
        "OrderNumber": "2",
        "ArticleNumber": "IPAD",
        "SerialNumber": "222"

    },
    {
        "OrderNumber": "3",
        "ArticleNumber": "PHONE",
        "SerialNumber": "333"

    },
    {
        "OrderNumber": "4",
        "ArticleNumber": "SWITCH",
        "SerialNumber": "444"

    },
    {
        "OrderNumber": "5",
        "ArticleNumber": "HARDWARE",
        "SerialNumber": "555"

    },
    {
        "OrderNumber": "6",
        "ArticleNumber": "MAC",
        "SerialNumber": "666"

    }, 
    {
        "OrderNumber": "7",
        "ArticleNumber": "PRINTER",
        "SerialNumber": "777"

    }, 
    {
        "OrderNumber": "8",
        "ArticleNumber": "MAC",
        "SerialNumber": "888"

    }
];

Array that I want to compare from

var articleNumberList = [
    {
        "Article": "CLIENT",
        "Model": "client"

    },
    {
        "Article": "IPAD",
        "Model": "ipad"

    },
    {
        "Article": "PHONE",
        "Model": "phone"

    },
    {
        "Article": "SWITCH",
        "Model": "switch"

    },
    {
        "Article": "HARDWARE",
        "Model": "hardware"

    },
    {
        "Article": "MAC",
        "Model": "mac",


    }, {
        "Article": "PRINTER",
        "Model": "printer"


    }
];

I want to check the first array attribute ArticleNumber and compare it to the second array attribute Article. Once it finds a match, sort it into another array, corresponding to the Article attribute

What I have tried (and is currently working)

for (i = 0; i < serialList.length; i++) {

    for (u = 0; u < articleNumberList.length; u++) {
        if (serialList[i].ArticleNumber == articleNumberList[u].Article) {
            if (serialList[i].ArticleNumber == "CLIENT") {
                clientList.push(serialList[i]);

            } else if (serialList[i].ArticleNumber == "IPAD") {
                ipadList.push(serialList[i]);

            } else if (serialList[i].ArticleNumber == "PHONE") {
                phoneList.push(serialList[i]);

            } else if (serialList[i].ArticleNumber == "SWITCH") {
                switchList.push(serialList[i]);

            } else if (serialList[i].ArticleNumber == "HARDWARE") {
                hardwareList.push(serialList[i]);

            } else if (serialList[i].ArticleNumber == "MAC") {
                macList.push(serialList[i]);

            } else if (serialList[i].ArticleNumber == "PRINTER") {
                printerList.push(serialList[i]);

            }
        }
    }
};

Why I don't want to use this solution: It is a nestled for loop and this will eventually be used for a database of all kinds of hardware, the array serialList is today several thousands long and will continue to grow, the array articleNumberList is currently at around 40 and will also continue to grow. I also don't really like the IF, ELSE IF statements, I feel that it probably can be handled with array.filter() but I don't really know how to approach it.

1 Answer 1

1

If you have a list of valid article types, you can initialize a map (buckets) that hold an array of serial items.

Note: You should not create a variable for each list. Just store each list in a map that is keyed on the type.

const serialList = [
  { "OrderNumber": "1", "ArticleNumber": "CLIENT", "SerialNumber": "111" },
  { "OrderNumber": "2", "ArticleNumber": "IPAD","SerialNumber": "222" },
  { "OrderNumber": "3", "ArticleNumber": "PHONE", "SerialNumber": "333" },
  { "OrderNumber": "4", "ArticleNumber": "SWITCH", "SerialNumber": "444"  },
  { "OrderNumber": "5", "ArticleNumber": "HARDWARE", "SerialNumber": "555" },
  { "OrderNumber": "6", "ArticleNumber": "MAC", "SerialNumber": "666" }, 
  { "OrderNumber": "7", "ArticleNumber": "PRINTER", "SerialNumber": "777" }, 
  { "OrderNumber": "8", "ArticleNumber": "MAC", "SerialNumber": "888"}
];

const articleNumberList = [
  { "Article": "CLIENT", "Model": "client" },
  { "Article": "IPAD", "Model": "ipad" },
  { "Article": "PHONE", "Model": "phone" },
  { "Article": "SWITCH", "Model": "switch" },
  { "Article": "HARDWARE", "Model": "hardware" },
  { "Article": "MAC", "Model": "mac", },
  { "Article": "PRINTER", "Model": "printer" }
];

const buckets = articleNumberList
  .reduce((acc, { Article }) => acc.set(Article, []), new Map);

for (let serialItem of serialList) {
  buckets.get(serialItem.ArticleNumber)?.push(serialItem);
}

console.log(Object.fromEntries([...buckets]));

console.log(buckets.get('MAC')); // Get only the MAC items
.as-console-wrapper { top: 0; max-height: 100% !important; }

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you! This was precisely what I was looking for

Your Answer

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.