Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何筛选2个对象数组并有效地处理它?_Javascript_Performance_Typescript_Ecmascript 6_Filtering - Fatal编程技术网

Javascript 如何筛选2个对象数组并有效地处理它?

Javascript 如何筛选2个对象数组并有效地处理它?,javascript,performance,typescript,ecmascript-6,filtering,Javascript,Performance,Typescript,Ecmascript 6,Filtering,我有两个不同类型的对象数组,具有不同的键组合。 如何为下面的代码执行有效的匹配和对象更新?我尝试了与.filter的不同组合,但尚未成功。 我正在根据selectionList更新临时主列表 for (let selObj of selctionList) { for (let obj of masterList) { if (selObj['n'] == obj['name']) { obj['checked'] = true;

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

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}]`

通过使用哈希映射直接访问
主列表
条目的名称,可以将此代码的时间效率从O(n²)提高到O(n):

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”:“香肠”},{“id”:464,“cost”:150,“name”:“Juice”};
const selectionList=[{“q”:1,“r”:350,“n”:“Coke”},{“q”:2,“r”:550,“n”:“Bread”}];
//创建映射以按名称为主列表设置关键帧
const index=newmap(masterList.Map(o=>[o.name,o]);
//首先初始化checked属性
对于(主列表的常量对象)对象检查=假;
//然后在映射中进行迭代和查找。
for(selectionList的常数{q,r,n}){
const obj=index.get(n);//查找在固定时间内进行
如果(!obj)继续;
目标成本=r;
对象数量=q | | 1;
obj.checked=true;
}
控制台日志(主列表)
使用lodash的
keyBy
加速计算的功能解决方案。 输出:
您应该添加示例数据和预期结果。添加选择列表和主列表数据plsif false set false。。。?最后一次检查和更新没有意义(如果它有一个布尔值)。我相信Anup的意思是如果没有“checked”键,那么就设置为false@OriDrori添加了示例数据和预期输出
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"
}]