首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >for和findIndex循环的替代选项?

for和findIndex循环的替代选项?
EN

Stack Overflow用户
提问于 2019-11-25 01:15:26
回答 4查看 66关注 0票数 3

我目前正在使用forfindIndex来更新主result变量中的总数。有没有其他方法可以重写这段代码,使其更短或更具可读性?

代码语言:javascript
运行
复制
const payload = [
        { Id: 1, Total: 5 },
        { Id: 3, Total: 2 },
]

const result = {
    Items: [
        { Id: 1, Name: 'Item 1 A', Total: 1, Type: "Main"},
        { Id: 1, Name: 'Item 1 B', Total: 0},
        { Id: 2, Name: 'Item 2 C', Total: 1, Type: "Main"},
        { Id: 2, Name: 'Item 2 D', Total: 0},
        { Id: 3, Name: 'Item 3 E', Type: "Main"},
        { Id: 3, Name: 'Item 3 F', Total: 0},
    ]
}

for(const itemPayload of payload) {
    const itemIndex = result.Items.findIndex(item => item.Id === itemPayload.Id && item.Type === "Main");
    
    if (itemIndex !== -1) {
        result.Items[itemIndex].Total = itemPayload.Total;
    }
}

console.log(result);

EN

回答 4

Stack Overflow用户

发布于 2019-11-25 01:50:43

在这里,我们创建了一个Map,然后在循环中访问它。它更整洁,可读性更好。

代码语言:javascript
运行
复制
const payload = [
  { Id: 1, Total: 5 },
  { Id: 3, Total: 2 },
]

const result = {
  Items: [
    { Id: 1, Name: 'Item 1 A', Total: 1, Type: "Main" },
    { Id: 1, Name: 'Item 1 B', Total: 0 },
    { Id: 2, Name: 'Item 2 C', Total: 1, Type: "Main" },
    { Id: 2, Name: 'Item 2 D', Total: 0 },
    { Id: 3, Name: 'Item 3 E', Type: "Main" },
    { Id: 3, Name: 'Item 3 F', Total: 0 },
  ]
};


const payloadMap = payload.reduce((map, obj) => {
  map[obj.Id] = obj.Total;
  return map;
}, {});

result.Items = result.Items.map(item => {
  if (item.Type === 'Main' && payloadMap[item.Id]) {
    item.Total = payloadMap[item.Id];
  }
  return item;
});

console.log(result);

票数 2
EN

Stack Overflow用户

发布于 2019-11-25 01:20:50

您可以将有效负载转换为映射,然后仅循环result.Items一次(而不是通过findIndex重复执行):

代码语言:javascript
运行
复制
const payloadMap = new Map(payload.map(({Id, Total}) => [Id, Total]));
for (const item of result.Items) {
    if (item.Type === "Main") {
        const total = payloadMap.get(item.Id);
        if (total !== undefined) {
            item.Total = total;
        }
    }
}

现场示例:

代码语言:javascript
运行
复制
const payload = [
        { Id: 1, Total: 5 },
        { Id: 3, Total: 2 },
]

const result = {
    Items: [
        { Id: 1, Name: 'Item 1 A', Total: 1, Type: "Main"},
        { Id: 1, Name: 'Item 1 B', Total: 0},
        { Id: 2, Name: 'Item 2 C', Total: 1, Type: "Main"},
        { Id: 2, Name: 'Item 2 D', Total: 0},
        { Id: 3, Name: 'Item 3 E', Type: "Main"},
        { Id: 3, Name: 'Item 3 F', Total: 0},
    ]
}

// Convert the payload to a Map:
const payloadMap = new Map(payload.map(({Id, Total}) => [Id, Total]));

// Loop through `result.Items` just once:
for (const item of result.Items) {
    if (item.Type === "Main") {
        const total = payloadMap.get(item.Id);
        if (total !== undefined) {
            item.Total = total;
        }
    }
}

console.log(result);

映射针对随机访问检索进行了优化。

另一种选择是除了result中的type = "Main"项的数组之外,还可以有一个Map of add项,两者都引用相同的对象,但这意味着当您向数组添加/从数组中删除时,您还必须在Map中添加/删除。

票数 1
EN

Stack Overflow用户

发布于 2019-11-25 01:21:03

如果这就是你要找的,你可以试试这样的东西。

代码语言:javascript
运行
复制
const payload = [{
    Id: 1,
    Total: 5
  },
  {
    Id: 3,
    Total: 2
  },
]

const result = {
  Items: [{
      Id: 1,
      Name: 'Item 1 A',
      Total: 1,
      Type: "Main"
    },
    {
      Id: 1,
      Name: 'Item 1 B',
      Total: 0
    },
    {
      Id: 2,
      Name: 'Item 2 C',
      Total: 1,
      Type: "Main"
    },
    {
      Id: 2,
      Name: 'Item 2 D',
      Total: 0
    },
    {
      Id: 3,
      Name: 'Item 3 E',
      Type: "Main"
    },
    {
      Id: 3,
      Name: 'Item 3 F',
      Total: 0
    },
  ]
}


let newdata = result.Items.map(ele => {

  if (ele.Type == "Main") {
    let payload_ = payload.find(e => e.Id == ele.Id);
    if (payload_) {

      ele.Total = payload_.Total;

    }

  }
  return ele;

})

console.log(newdata);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59020315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档