更新对象数组中的对象属性的最有效方法

2023-12-14

我想知道更新存储在包含 10k+ 项的数组中的对象属性的最有效方法是什么。

例如,如果我有一个包含这样的对象的数组 {name:"", Price:"")

如果数组已包含该元素,我想替换或更类似于更新价格值。

检查数组是否包含名称 = x 的对象,如果是,则将价格替换为最新价格。

我不想在该数组中包含重复的元素,因此它不会变得很大,我认为如果属性值已存在于其中,我应该更新它。

到目前为止,我已经尝试了几种方法,例如使用 indexOf、splice 或仅使用 for 循环。我想知道处理大数组的最佳性能方式是什么。

let array = [
{name:"abc", price: 24},
{name:"cde", price: 25},
{name:"fgh", price: 22},
{name:"gfds", price: 21},
]

function addToArray(elem){
  //check if array contains elem by checking for name property value
  if(array.filter(el => el.name === elem.name).length > 0){
    //update the array element that has the name of the passed elem
  }
}

您说过您的起点是一个数组,但最有效的方法是使用Map,不是数组,其中键是名称,值是价格或包含价格的对象(取决于您是否需要其他信息)。

使用未排序的数组

但如果你用数组来做这件事,unless我们可以按排序顺序构建/维护数组(请参阅下面的“使用排序数组”),没有什么比循环遍历它查找具有给定值的前一个元素更有效的了name. filter不是正确的工具(您不需要它创建的数组)。您可以编写自己的循环:

let element;
for (let index = 0, length = array.length; index < length; ++index) {
    const thisElement = array[index];
    if (thisElement.name === name) {
        // Already have one
        element = thisElement;
        break;
    }
}
if (element) {
    element.price += price;
} else {
    array.push({name, price});
}

使用某些 JavaScript 引擎,您可能会得到这样的结果teensy如果你声明的话速度会快一点index, length, and thisElement循环之前:

let element, index, length, thisElement;
for (index = 0, length = array.length; index < length; ++index) {
    thisElement = array[index];
    // ...

但对其他人来说,情况可能恰恰相反。 (无论哪种方式都不太可能有很大的区别。)

Or use find:

const element = array.find(e => e.name === name);
if (element) {
    element.price += price;
} else {
    array.push({name, price});
}

其中任何一个都提供线性查找时间。但如果你使用的是Map,你会得到亚线性查找时间。

带地图

如果使用对象作为值:

const element = map.get(name);
if (element) {
    element.price += price;
} else {
    map.set(name, {name, price});
}

或者如果使用价格作为价值:

const currentPrice = map.get(name) ?? 0; // If not found, `get` returns undefined; convert it to 0
map.set(currentPrice + price);

使用排序数组

如果我们可以按排序顺序构建/维护数组(你说过你不能,但也许其他人稍后发现可以),我们可以通过使用二分搜索比线性查找做得更好(代价是slightly插入新元素时会产生更多开销,因为插入点之后的所有元素都必须移动)。这是更多的代码,但如果搜索时间是主要问题,它会减少搜索时间。

const upsert = (array, name, price) => {
    let left = 0;
    let right = array.length;
    while (left < right) {
        let guess = Math.floor((left + right) / 2);
        let element = array[guess];
        if (element.name === name) {
            // Found! Update it
            element.price += price;
            return;
        }
        if (element.name < name) {
            left = guess + 1;
        } else {
            right = guess - 1;
        }
    }
    // Not found, insert it
    array.splice(left, 0, {name, price});
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新对象数组中的对象属性的最有效方法 的相关文章

  • 使用浏览器内的 JS 数值求解三角方程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 给定变量值s v and h 并给定一个库 例如数字 js http www numericjs com index php我怎样才能用数
  • 如何使用jquery格式化数字

    我正在尝试删除 之后的数字 然后我想格式化数字 16810900 211233 喜欢这个 16 810 900 但我不知道该怎么做 这是我的 html 是这样的 div class main p class active 10200 00
  • 如果Functions是javascript中的对象,为什么function.constructor指向Function而不是Object?

    当像这样从窗口对象创建以下函数时 function userInfo 既然函数是对象 为什么 userInfo constructor 显示 Function 而不是 Object 当使用以下内容时 它甚至显示函数而不是对象 Functio
  • 如何使用 Underscore 获取 JavaScript 数组中的重复项

    我有一个数组 我需要重复的项目并根据特定属性打印这些项目 我知道如何使用 underscore js 获取唯一项目 但我需要找到重复项而不是唯一值 var somevalue name john country spain name jan
  • Nodejs 在路由器页面中包含 socket.io

    我有一个 Express Node 应用程序 并且我试图通过不在 app js 中包含所有 socket io 内容来保持代码整洁 我不知道解决这个问题的最佳方法 这是我最初的想法 感觉不是最干净的 app js var express r
  • 如何获得相对于特定父级的偏移量?

    我想获取元素相对于的偏移量特定的父母不是直接的 也不是文档 我在互联网上查找并找到了offset http api jquery com offset and position http api jquery com position jQ
  • 将其作为参数传递给 addEventListener()

    我想添加change一组复选框的事件 我如何访问this在我的事件函数中 这样当我执行事件时我可以访问复选框的值 这是我当前的代码 var checkboxes document getElementsByClassName cb Arra
  • 强制执行 show.bind

    我有一个包含数据的表 当从另一个视图触发事件时 我希望视图检查 show bind 语句 问题是该事件没有更改当前视图中的任何数据 foo html tr p canBeRemoved p tr 我正在使用 EventAggregator
  • 尝试使用 CasperJS 跟踪 iframe 中的链接

    我正在尝试使用CasperJS http casperjs org index html跟踪 iframe 中的链接 但我似乎无法获取 iframe 的文档 这是使用我找到的 iframe 示例页面进行的测试 第三个 iframe 有一个名
  • Javascript“命名空间”和 jQuery AJAX

    我正在使用此处列出的建议 http www odetocode com articles 473 aspx http www odetocode com articles 473 aspx 使用模拟的JavaScript AJAX网络聊天系
  • React JS“this”没有按预期工作

    我有下面的代码 save function var this this console log this refs itemText this setState isEditing false function console log In
  • 标记内的值发生变化时调用函数

    JavaScript 有没有什么方法可以在段落标记的值更改时调用函数 概述 HTML p 00 00 p
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • Webpack:如何将 javascript 注入 HTML 而不是单独的 JS 文件

    有没有办法让 webpack 将输出注入 HTML 而不是单独的文件 我不得不使用html webpack inline source plugin https github com DustinJackson html webpack i
  • 谷歌浏览器如何启动桌面应用程序?

    我真的不知道术语 所以我将从一个例子开始 如果我点击磁力链接 Google Chrome 会询问我是否要启动 torrent 客户端 我单击 确定 chrome 启动该应用程序 该应用程序根据链接执行一些操作 现在有办法查看应用程序如何从
  • 设置环境变量供节点检索

    我正在尝试遵循教程 它说 有几种加载凭据的方法 从环境变量加载 从磁盘上的 JSON 文件加载 键需要如下所示 USER ID USER KEY 这意味着如果您正确设置环境变量 您 根本不需要管理应用程序中的凭据 根据一些谷歌搜索 我似乎需
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip
  • 在 Map() 的条目上使用 Promise.all

    我正在使用 Map 来表示一些键 值对 let myMap new Map myMap set foo bar myMap set foo2 bar42 对于每个 Map 条目 我执行一个返回 Promise 的函数 所有这些 Promis
  • Chrome 中的 addEventListener

    我正在关注 Lynda com 上有关新 DOM 事件模型的教程 这是我正在使用的代码 function addEventHandler oNode sEvt fFunc bCapture if typeof window event un

随机推荐

  • 在 C++ 中使用正则表达式对字符串进行标记并保留分隔符

    我想修改给定的正则表达式以生成以下匹配列表 我很难用语言描述这个问题 我想使用正则表达式来匹配一组 标记 具体我想要 要匹配 任何不包含这些字符的字符串都应该是匹配的 我遇到的问题是区分一根管道和两根管道 我怎样才能产生所需的匹配 非常感谢
  • 将函数应用于我的数据框中的所有列

    我无法将自定义函数应用到dataframe df pd DataFrame a related 1 related 0 related 1 b request 1 request 0 request 1 c offer 1 offer 0
  • 尝试制作带有条形图和差异线/值的动态 D3 图表

    我已询问以下有关创建显示差异值百分比和线条的条形图的帮助 以下是链接 如何使用 D3 js 在条形图中创建带有值的百分比差异箭头线 我创建此线程是为了寻求帮助 使同一图表更加动态 以下是我的尝试 以适合任何分辨率的方式使其动态化 即响应式
  • CMake target_include_directories(SYSTEM ...):SYSTEM 选项似乎不适用于针对 Xcode 的最新版本的 CMake

    我们正在构建一个依赖于Boost的应用程序 编译会产生很多警告 班级成员不能重新声明 在 Boost 标头 tag of hpp 中 为了避免生成垃圾邮件 我们决定将 Boost 标头包含为系统标头 target include direc
  • 交叉编译时缺少crt1和crti

    我正在尝试构建一个基于 GCC4 5 和 newlib 的交叉编译工具链 并启用 gold 和链接时间优化 GCC 编译正常 但没有生成 crt1 o 或 crti o 文件 因此 当我尝试使用编译器构建 Newlib 时 它会抱怨以下消息
  • PHP奇怪的按位运算符对字符串的影响

    更新 移至新问题 好吧 阅读 PHP 文档后 现在这些按位运算符就很清楚了 但是 嗯 这是什么 dump1 var dump two identical strings two identical strings mind the stri
  • 可以使用 htaccess 隐藏图像路径吗?

    我有这样的图像路径http blablablabla com Admin img blablabla jpg但我不想向用户显示此路径 我可以隐藏此 URLhtaccess 例如 用户将看到这样的路径http blablablabla com
  • NSLocalizedString 问题

    我有 IBAction about UIAlertView alert UIAlertView alloc initWithTitle NSLocalizedString About Title of AlertView message A
  • ostringstream 和复制构造函数的问题[重复]

    这个问题在这里已经有答案了 可能的重复 为什么不允许复制字符串流 如何在 C 中从一个字符串流对象复制到另一个字符串流对象 编译类 T 失败 Visual C 和 GCC 产生 iostreams 模板错误 这是代码 include
  • cellForRowAtIndexPath 从未在 UITableViewController 中调用

    使用 UITableViewController 永远不会通过以下方式调用 cellForRowAtIndexPath numberOfRowsInSection 是 import UIKit import EventKit class E
  • Xtext Bundle org.eclipse.emf.mwe.utils 无法解析

    我正在尝试学习使用 Xtext 当我使用市场或使用安装新软件在现有 Eclipse Neon 安装中安装 Xtext 时 我无法创建 Xtext 项目 请参阅无法在 Eclipse 中创建 Xtext 项目 然后我尝试使用 Eclipse
  • 如何使用GeoJson定义圆?

    我想在 Mongodb 中使用几何 但根据 geojson 不支持圆geojson org 我遇到了完全相同的问题 解决方案是创建一个大致近似于圆的多边形 想象一个具有 32 条以上边的多边形 我写了一个执行此操作的模块 你可以这样使用它
  • 在 Java 中验证日期

    我使用的是 NetBeans IDE 7 2 我有两个单独的课程newDateTest java and newDateMethod java 我目前正在使用我的方法类来验证我在测试类中使用的用户输入的日期 到目前为止 在我的测试课中 我有
  • 在第一个和最后一个网格项目之前和之后添加空格

    我的问题与此相同问题 但给定的解决方案不起作用 这里有一个codepen我正在处理的事情 我尝试了两种不同的方法 这两种方法几乎都是正确的 但不完全正确 1 申请 before and after第一个和最后一个网格项的伪类 不幸的是当我添
  • 在 HTML Canvas 中添加字母间距

    我读过很多 StackOverflow 答案和其他页面 讨论如何在 Canvas 中设置字母间距 更有用的之一是canvas 元素中的字母间距 正如另一个问题所说 我有一个要在其中绘制文本的画布元素 我想设置类似于 CSS letter s
  • 如何使用jquery触发anchor的默认点击事件?

    假设我的页面中有一个锚点 例如 a href header turn to header a 然后我还在我的页面中设置了一个按钮
  • 气氛响应、广播不调用 javascript onMessage 处理程序

    我正在与气氛合作 试图使用在我的 Eclipse 环境中本地运行的气氛 2 0 3 tomcat 7 0 42 来获得简单的基本实现 也从外部机器连接以查看与wireshark的流量 我遇到的问题是无论我使用什么传输 websocket s
  • 如何在 PHP 文件中获取 jQuery 变量值 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么它们不起作用以及预期结果 也可以看看 Stack Overflow 问题清单 有关您编写的代码的问题必
  • 在带有 html 和正文显示的窗口中截断的页面:隐藏

    注 基于以下答案 aavrug and kukkuz 我重新组织了我的问题 以便它充分传达我想问的内容 我有一个页面布局 其中有一个顶部导航栏和一个侧面导航栏 它还具有显示数据的主要部分 因为我只想滚动主要部分 所以我设置了html bod
  • 更新对象数组中的对象属性的最有效方法

    我想知道更新存储在包含 10k 项的数组中的对象属性的最有效方法是什么 例如 如果我有一个包含这样的对象的数组 name Price 如果数组已包含该元素 我想替换或更类似于更新价格值 检查数组是否包含名称 x 的对象 如果是 则将价格替换