javascript - 我应该如何创建一个在不使用数组的情况下存储带有子 id 的 id 的对象?

标签 javascript vue.js

我需要将数据发送到具有多个 id 且其中包含子 id 的服务器。目前我正在使用数组,但因为我需要处理 dom 上的每个 id 和子 id(当前使用 vue),所以我一次又一次地使用大量 find() 和 findIndex() 。如果有办法直接使用 ids,我可以使用 order[id][subid] 访问或检查它们。

目前我正在使用这个结构:

let data = {
    orders: [
        { order_id: 4, items: [{ item_id: 6 }, { item_id: 7 }, { item_id: 8 }] },
        { order_id: 1, items: [{ item_id: 1 }, { item_id: 2 }, { item_id: 3 }] },
    ];
}

例如,当我想要检查订单项是否已选中时,我必须这样做

function check(order_id, item_id) {
    let order_i = data.orders.findIndex((o) => o.order_id == order_id);

    if (order_i != -1) {
        let item_i = data.orders[order_i].items.findIndex((o) => o.item_id == item_id);
    }

    if (item_i != -1) {
        return true;
    } else {
        return false;
    }
}

或者类似的东西。我想怎样使用它

let data = {
    orders: {
        4: {6:'',7:'',8:''},
        1: {1:'',2:'',3:''}
    }
}

然后我就使用data.orders?.[order_id]?.[item_id]

我不确定这是否是一个好方法。看起来并非如此。 在不使用数组的情况下,我可以使用什么结构来实现此目的?

最佳答案

我认为你想要的数据结构是Map。它存储键值对,并且可以在恒定时间内检索特定键的值(而不是搜索整个列表)。 set(key, value)get(key) 方法用于与 Map 对象交互。

如果所有订单都存储在这个结构中,你应该使用id作为数组中的索引,这将是最有效的。 如果订单不是连续的(并非所有 id 都存在),您可以使用一个 Map 来表示订单,并使用另一个 Map 来表示项目。如果平均而言,给定订单中的项目不多,那么使用数组应该没问题。

了解更多: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

关于javascript - 我应该如何创建一个在不使用数组的情况下存储带有子 id 的 id 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73351770/

相关文章:

javascript - firebase 的调整大小扩展完成后获取下载网址

javascript - 使用默认操作系统程序打开所有文件类型

javascript - 使用 Javascript 继承?如何获取 'super' 或 'base'

javascript - 非中断空间在 vue 模板中呈现为常规空间

javascript - 渲染子组件后的启动方法

javascript - 如何传递对象数组以在 Vue 2.0 中选择选项

javascript - IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

javascript - 使用 1x1 <img> 标签设置第三方 cookie - Javascript 不会丢弃 cookie

javascript - v-通过降序迭代实现逆序

javascript - 如何禁用输入类型数字上的所有点? vue.js 2