代码之家  ›  专栏  ›  技术社区  ›  Dan Goodspeed

构建“可查询”的javascript/json对象

  •  2
  • Dan Goodspeed  · 技术社区  · 6 年前

    我想构建一个可以通过多个参数查询的对象。我想到的方法是将数据存储在具有数据属性的范围内,并使用jquery进行“搜索”,但我不喜欢这样。

    为了快速演示,我将“数据”保存如下:

    <span data-color="red blue" data-name="bill" data-value="47"></span>
    <span data-color="blue green white" data-name="jane" data-value="13"></span>
    <span data-color="red" data-name="mary jack" data-value="35"></span>
    <span data-color="green" data-name="bill" data-value="43"></span>
    <span data-color="white" data-name="steve" data-value="123"></span>
    

    因此,如果我想将所有值与颜色“红色”匹配,我可以这样做:

    $("span[data-color~='red']").each(...);
    

    如果我想匹配所有的名字“bill”和颜色“green”,我会这样搜索

    $("span[data-color~='green'][data-name~='bill']").each(...);    
    

    虽然这感觉有点聪明,但也有点黑客,用CSS选择器将javascript欺骗到查询中。有没有更好的方法可以存储和访问数据?请求可能很多,所以我希望它快速,而不是通过HTTP请求来查询数据服务器端。在我的情况下,可能有数百个条目需要搜索(我不喜欢CSS选择器路由的另一个原因)。

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  3
  •   CertainPerformance    6 年前

    使用一个普通的javascript对象数组,然后使用数组方法来过滤、迭代等等。不需要jquery。例如:

    const arr = [
      { colors: ['red', 'blue'], name: 'bill', value: 47 },
      { colors: ['blue', 'green', 'white'], name: 'jane', value: 13 },
      { colors: ['red'], name: 'mary jack', value: 35 },
      { colors: ['green', 'blue'], name: 'bill', value: 88 },
    ];
    const reds = arr.filter(({ colors }) => colors.includes('red'));
    console.log(reds);
    const greenBills = arr.filter(({ colors, name }) =>
      colors.includes('green') && name === 'bill'
    );
    console.log(greenBills);