【问题标题】:How to filter 2 object arrays and process it efficiently?如何过滤 2 个对象数组并有效地处理它?
【发布时间】:2018-11-11 00:58:33
【问题描述】:

我有 2 个具有不同组合键的不同类型的对象数组。 如何为以下代码执行有效的匹配和对象更新?我尝试了与 .filter 的不同组合,但还没有成功。 我正在根据 selectionList 更新临时 masterList。

for (let selObj of selctionList) {
    for (let obj of masterList) {

        if (selObj['n'] == obj['name']) {
            obj['checked'] = true;
            obj['cost'] = selObj['r'];
            obj['qty'] = (selObj['q'] ? selObj['q'] : 1);
            break;
        }
    }
}
for (let obj of masterList) {
    if (!obj['checked']) {
        obj['checked'] = false;
    }
}

样本数据

`masterList = 
[{"id":459,"cost":250,"name":"Coke"},
{"id":460,"cost":60,"name":"Cookies"},
{"id":461,"cost":100,"name":"Pizza"},
{"id":462,"cost":250,"name":"Bread"},
{"id":463,"cost":150,"name":"Sausage"},
{"id":464,"cost":150,"name":"Juice"}];
selectionList = [{"q":1,"r":350,"n":"Coke"}
{"q":2,"r":550,"n":"Bread"}]`

输出:

`[{"id":459,"cost":350,"name":"Coke", "checked" : true,"qty":1},
{"id":460,"cost":60,"name":"Cookies","checked" : false},
{"id":461,"cost":100,"name":"Pizza","checked" : false},
{"id":462,"cost":550,"name":"Bread","checked" : true,"qty":2},
{"id":463,"cost":150,"name":"Sausage","checked" : false},
{"id":464,"cost":150,"name":"Juice","checked" : false}]`

【问题讨论】:

  • 您应该添加示例数据和预期结果。
  • 请添加selctionList和masterList数据
  • 如果 false 设置为 false ...?最后的检查和更新没有意义(如果它有一个布尔值)。
  • 我相信 Anup 的意思是如果不存在“已检查”键,则设置为 false
  • @OriDrori 添加了示例数据和预期输出

标签: javascript performance typescript ecmascript-6 filtering


【解决方案1】:

您可以通过使用哈希映射直接访问 @ 987654321@ 按其名称输入:

const masterList = [{"id":459,"cost":250,"name":"Coke"}, {"id":460,"cost":60,"name":"Cookies"}, {"id":461,"cost":100,"name":"Pizza"}, {"id":462,"cost":250,"name":"Bread"}, {"id":463,"cost":150,"name":"Sausage"}, {"id":464,"cost":150,"name":"Juice"}];
const selectionList = [{"q":1,"r":350,"n":"Coke"},{"q":2,"r":550,"n":"Bread"}];

// Create a Map to key the masterList by name
const indexed = new Map(masterList.map(o => [o.name, o]));
// First init the checked property
for (const obj of masterList) obj.checked = false;
// Then iterate and lookup in the Map.
for (const {q, r, n} of selectionList) {
    const obj = indexed.get(n); // Lookup happens in constant time 
    if (!obj) continue;
    obj.cost = r;
    obj.qty = q || 1;
    obj.checked = true;
}

console.log(masterList);

注意:想要存储 checked 属性似乎有点过头了,因为匹配的对象已经获得了其他人没有的 qty 属性。在随后的代码中,您可以通过以下方式轻松检查:

checked = 'qty' in obj;

【讨论】:

    【解决方案2】:

    使用 lodashkeyBy 加速计算的函数式解决方案。

    const masterList = [{"id":459,"cost":250,"name":"Coke"}, {"id":460,"cost":60,"name":"Cookies"}, {"id":461,"cost":100,"name":"Pizza"}, {"id":462,"cost":250,"name":"Bread"}, {"id":463,"cost":150,"name":"Sausage"}, {"id":464,"cost":150,"name":"Juice"}];
    const selectionList = [{"q":1,"r":350,"n":"Coke"},{"q":2,"r":550,"n":"Bread"}];
    
    const selectionMap = _.keyBy(selectionList, "n");
    const output = masterList.map(masterItem => {
      // loop through the master list, see if we have it selected.
      const selectItem = selectionMap[masterItem.name];
      if(selectItem === undefined){
        // If it is not checked, return that information.
        return {
          ...masterItem,
          checked: false
        };
      }
      // if it is checked, return checked: true and the quantity info which defaults to 1.
      return {
        ...masterItem,
        checked: true,
        qty: selectItem['q'] || 1
      };
    });
    
    console.log(output);
    

    输出:

    [[object Object] {
      checked: true,
      cost: 250,
      id: 459,
      name: "Coke",
      qty: 1
    }, [object Object] {
      checked: false,
      cost: 60,
      id: 460,
      name: "Cookies"
    }, [object Object] {
      checked: false,
      cost: 100,
      id: 461,
      name: "Pizza"
    }, [object Object] {
      checked: true,
      cost: 250,
      id: 462,
      name: "Bread",
      qty: 2
    }, [object Object] {
      checked: false,
      cost: 150,
      id: 463,
      name: "Sausage"
    }, [object Object] {
      checked: false,
      cost: 150,
      id: 464,
      name: "Juice"
    }]
    

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2019-09-26
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2015-05-16
      • 2022-11-26
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多