【问题标题】:How to consolidate multiple lists into a single list?如何将多个列表合并为一个列表?
【发布时间】:2021-06-02 20:55:09
【问题描述】:

由于所有 3 种功能的产品都相似,因此价格有所不同。那么有什么方法可以让我将所有产品保存在一个函数中并将它们调用到另外两个函数中,并且只更改最后两个函数中的价格?我不想为每种类型重复代码

由于有三个功能,并且由于它是重复的,我想只保留一个主功能,然后将产品列表从主功能调用到除价格之外的其他两个功能。因为每个人的价格都不一样。有人可以让我知道该怎么做吗?如何在不重复的情况下调用另一个函数内部的函数?

我想将产品列表从主函数调用到另外两个函数,因此我不重复代码,并且我希望在这两个函数中只添加价格。我该怎么做?

有人可以告诉我我必须对代码进行哪些更改才能实现它吗?

谢谢

Product.js

function ProductDataConsolidator() { }

ProductDataConsolidator.get = function () {
    var l = new LawnmowerRepository().getAll();
    var p = new PhoneCaseRepository().getAll();
    var t = new TShirtRepository().getAll();

    var products = [];

    for (var i = 0; i < l.length; i++) {
        products.push({
            id: l[i].id,
            name: l[i].name,
            price: l[i].price.toFixed(2),
            type: "Lawnmower"
        });
    }

    for (var i = 0; i < p.length; i++) {
        products.push({
            id: p[i].id,
            name: p[i].name,
            price: p[i].price.toFixed(2),
            type: "Phone Case"
        });
    }

    for (var i = 0; i < t.length; i++) {
        products.push({
            id: t[i].id,
            name: t[i].name,
            price: t[i].price.toFixed(2),
            type: "T-Shirt"
        });
    }

    return products;
}

ProductDataConsolidator.getInUSDollars = function () {
    var l = new LawnmowerRepository().getAll();
    var p = new PhoneCaseRepository().getAll();
    var t = new TShirtRepository().getAll();

    var products = [];

    for (var i = 0; i < l.length; i++) {
        products.push({
            id: l[i].id,
            name: l[i].name,
            price: (l[i].price * 0.76).toFixed(2),
            type: "Lawnmower"
        });
    }

    for (var i = 0; i < p.length; i++) {
        products.push({
            id: p[i].id,
            name: p[i].name,
            price: (p[i].price * 0.76).toFixed(2),
            type: "Phone Case"
        });
    }

    for (var i = 0; i < t.length; i++) {
        products.push({
            id: t[i].id,
            name: t[i].name,
            price: (t[i].price * 0.76).toFixed(2),
            type: "T-Shirt"
        });
    }

    return products;
}

ProductDataConsolidator.getInEuros = function () {
    var l = new LawnmowerRepository().getAll();
    var p = new PhoneCaseRepository().getAll();
    var t = new TShirtRepository().getAll();

    var products = [];

    for (var i = 0; i < l.length; i++) {
        products.push({
            id: l[i].id,
            name: l[i].name,
            price: (l[i].price * 0.67).toFixed(2),
            type: "Lawnmower"
        });
    }

    for (var i = 0; i < p.length; i++) {
        products.push({
            id: p[i].id,
            name: p[i].name,
            price: (p[i].price * 0.67).toFixed(2),
            type: "Phone Case"
        });
    }

    for (var i = 0; i < t.length; i++) {
        products.push({
            id: t[i].id,
            name: t[i].name,
            price: (t[i].price * 0.67).toFixed(2),
            type: "T-Shirt"
        });
    }

    return products;
}

【问题讨论】:

    标签: javascript arrays list


    【解决方案1】:

    您首先要在每个列表上使用Array.prototype.map (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) 将它们更改为您想要的形式。例如:

    const lawnmowers = new LawnmowerRepository().getAll().map((lawnmower) => {
      return {
        id: lawnmower.id,
        name: lawnmower.name,
        price: lawnmower.price.toFixed(2),
        type: 'Lawnmower'
      };
    });
    

    然后,一旦您拥有所有三个列表,只需将它们与 Array.prototype.concat (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat) 连接在一起,如下所示:

    const products = lawnmowers.concat(phonecases).concat(tshirts);
    

    (如果你想更高级一点,你可以使用Object.assign,或者如果你可以访问它,可以使用属性传播语法来缩短它)

    推荐:传播属性

    这在 Internet Explorer 中不可用,但在所有主要 Web 浏览器中都可用。在大多数情况下,我会建议这样做。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_object_literals

    const lawnmowers = new LawnmowerRepository().getAll().map((lawnmower) => {
      return {
        ...lawnmower,
        price: lawnmower.price.toFixed(2),
        type: 'Lawnmower'
      };
    });
    

    Object.assign

    在没有财产传播的情况下,这是我推荐的方法。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

    const lawnmowers = new LawnmowerRepository().getAll().map((lawnmower) => {
      return Object.assign(lawnmower, {
        price: lawnmower.price.toFixed(2),
        type: 'Lawnmower'
      });
    });
    

    【讨论】:

    • 由于产品在所有 3 种功能上都相似,只是价格有所不同。那么无论如何我可以将所有产品保留在一个函数中并将它们调用到另外两个函数中并且只更改最后两个函数中的价格吗?恐怕如果我按照上述建议的每种类型都这样做,我将不得不一次又一次地重复我不想要的代码。可以请建议吗?
    【解决方案2】:

    这样的?您可以使用货币参数调用.get(currency) 函数,因此您无需重复自己。此外,您可以将 3 个 for 循环压缩为外部 for 循环。您也可以改为使用 .map(),但 for 循环也可以。

    //Product.js
    
    function ProductDataConsolidator() { }
    
    ProductDataConsolidator.get = function (currency) {
        var l = new LawnmowerRepository().getAll();
        var p = new PhoneCaseRepository().getAll();
        var t = new TShirtRepository().getAll();
        const arr_names = [
          [l, "lawnmower"],
          [p, "Phone Case"],
          [t, "T-Shirt"],
        ]
        var products = [];
        
        let multiplier = currency == "euro"
                        ? 0.67
                        : currency == "dollar"
                        ? 0.76
                        : 1;
      
        for (let [arr,name] of arr_names){
          for (var i = 0; i < arr.length; i++) {
            products.push({
                id: arr[i].id,
                name: arr[i].name,
                price: (arr[i].price * multiplier).toFixed(2),
                type: name
            });
          }
        }
        
        return products;
    }

    或者,您还可以为其他 2 种货币设置专用函数,只需调用 .get(currency) 并包含货币参数。

    //Product.js
    
    function ProductDataConsolidator() { }
    
    ProductDataConsolidator.get = function (currency) {
        var l = new LawnmowerRepository().getAll();
        var p = new PhoneCaseRepository().getAll();
        var t = new TShirtRepository().getAll();
        const arr_names = [
          [l, "lawnmower"],
          [p, "Phone Case"],
          [t, "T-Shirt"],
        ]
        var products = [];
        
        let multiplier = currency == "euro"
                        ? 0.67
                        : currency == "dollar"
                        ? 0.76
                        : 1;
      
        for (let [arr,name] of arr_names){
          for (var i = 0; i < arr.length; i++) {
            products.push({
                id: arr[i].id,
                name: arr[i].name,
                price: (arr[i].price * multiplier).toFixed(2),
                type: name
            });
          }
        }
        
        return products;
    }
    
    ProductDataConsolidator.getInEuros = function(){
      return ProductDataConsolidator.get("euro");
    }
    
    ProductDataConsolidator.getInUSDollars = function(){
      return ProductDataConsolidator.get("dollar");
    }

    【讨论】:

    • 嗨亚历克斯,谢谢它真的是我想要的。我尝试对另一个 js 文件执行相同的步骤,该文件是上述函数的渲染页面。但我无法得到它。这是您能否提出相同建议的链接。谢谢stackoverflow.com/questions/66474079/…
    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多