数组逻辑匹配列表

时间:2019-05-13 04:10:20

标签: javascript reactjs typescript

我有一个快速链接小部件,其中包含用户可以选择的不同类型的链接/菜单。一次只能显示四个不同的菜单选项-不能或多或少。

在代码中,我首先提取所有菜单选项,它们以[1,2,3 ...]的形式出现,该菜单选项对应于存储菜单选项的列表中的行。

用户选择菜单选项的返回方式也与[2,3,8,9]之类的数组相同,其编号对应于从列表中获得哪一行。

示例:

所有菜单/小工具

  1. 旅行
  2. 酒店
  3. 汽车
  4. 公共汽车
  5. 飞机
  6. 假日

这将返回一个数组[1,2,3,4,5,6]

如果我选择保存酒店,巴士,飞机和假期,那么我的用户设置将返回[2,4,5,6]。

问题: 它起作用,直到从用户已保存的列表中删除小部件,然后该小部件仅将显示三个菜单/链接。我希望小部件始终显示四个链接,因此如果缺少一个链接,则需要填充数组。因此,如果缺少它,我想显示另一个链接。最好将链接设置为丢失时将其设置为默认链接(始终是列表中的前四个链接),但这不是必需的。我已经为此建立了逻辑,但是它不起作用。

代码:

public async getUserWidgets(): Promise<Widget[]> {
    return new Promise<Widget[]>(async(resolve, error) => {
    let allWidgets = await this.getAllWidgets(); // Returns an array of all links [1,2,4...]

    let userRepository = new UserProfileRepository(this.absoluteWebUrl);
    let userSettings = await userRepository.getUserExtensionValues(this.context); //contains the user saved widgets ex [2,3,6,7]

    var result:Widget[] = [];

//如果用户没有设置,或者保存的链接少于4个

    if (userSettings == null || userSettings.QuickLinksWidgets == null || userSettings.QuickLinksWidgets.length <  4) {
        result = allWidgets.filter((w) => {return w.defaultWidget;}).slice(0,4);   //default widget but not really needed.
    }
    else {
        var ids = userSettings.QuickLinksWidgets;

        for (let i = 0; i < 4; i++) {
            let id = '' + ids[i];
            let w = allWidgets.filter((e) => { return e.id == id;});

            if (w.length == 0) {
                continue;
            }

            result.push(w[0]);

        }

    };
    resolve(result);
      }); }

1 个答案:

答案 0 :(得分:0)

根据您的描述,听起来好像您未正确更新(getUserWidgets更改时调用userSettings.QuickLinksWidgets?首先检查以确保它按您的期望被调用。

如果正确调用了getUserWidgets,请尝试在其设置中添加默认值,直到共有4个链接。现在,如果默认链接的设置少于4个,则您使用的是默认链接。

例如:

// take up to 4 user links and make sure we don't exceed the length of the array
for (let i = 0; i < 4 && i < userSettings.QuickLinksWidgets.length - 1; i++) {
  // get the id of the widget in the user's settings
  let widgetId = userSettings.QuickLinksWidgets[i].id
  // find the widget with a matching id and add it to our results
  result.push(allWidgets.find(w => w.id === widgetId)
}

// if there's not already 4 links, add more to our list
let j = 0
while (result.length < 4) {
  // check the first 4 user links to make sure we didn't include this link already
  if (!userSettings.QuickLinksWidgets.slice(0, 4).includes(allWidgets[j].id)) {
    // add the new widget to the results
    result.push(allWidgets[j])
  }

  j++
}

resolve(result)