【问题标题】:Sort array in to several based on value from second array根据第二个数组中的值将数组排序为多个
【发布时间】:2022-11-03 22:26:46
【问题描述】:

我正在尝试将对象从一个数组移动到七个不同的数组中。它们从一开始就在一个阵列中。我想根据另一个数组中具有一个相关属性的值对它们进行排序。

我要排序的数组 1

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"

    }
];

我要比较的数组

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"


    }
];

我想检查第一个数组属性 ArticleNumber 并将其与第二个数组属性 Article 进行比较。一旦找到匹配项,将其排序到另一个数组中,对应于 Article 属性

我尝试过的(目前正在工作)

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

            }
        }
    }
};

为什么我不想使用此解决方案: 它是一个嵌套的for循环,最终将用于各种硬件的数据库,数组serialList今天有几千长并将继续增长,数组articleNumberList目前在40左右并且还将继续增长。我也不太喜欢 IF、ELSE IF 语句,我觉得它可能可以用 array.filter() 处理,但我真的不知道如何处理它。

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    如果您有一个有效文章类型的列表,则可以初始化一个包含一系列序列项目数组的映射(存储桶)。

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

    【讨论】:

    • 我认为他们的意思是将项目分组到不同的数组中,而不是实际上sort
    猜你喜欢
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2018-11-18
    • 2013-04-30
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多