在新的 Array Javascript 中对对象中的部分重复对象进行计数和记录
Count and record partially repeating objects in objects in a new Array Javascript
我需要处理对象的源数组,数组中的许多对象具有三个相同的属性值。正是这些值将用于创建新对象并将其推送到目标数组。当源数组上的另一个对象与目标数组上的某个对象具有相同的三个属性值时,目标数组上的匹配对象的访问计数将递增 1。
为了帮助您理解,在源数组中,每个对象都是属于用户的用餐记录。在第二个数组中,我需要存储用户详细信息和他们的用餐次数。
我尝试了一些失败的解决方案,如下所示。我认为下面的代码会创建一个文字对象,通过找到它的 indexOf 来检查它是否在目标数组中(-1 表示未找到(,如果未找到,则将其推开。问题是它永远不会找到对象,如果我搜索 3000 顿饭,第二个数组最终会变成 3000 个长!
下面的代码不会尝试存储访问计数。
userArray = new Array();
for (var i = 0; i < filteredObjects.length; i++) {
var user = {
forname: filteredObjects[i].forname,
surname: filteredObjects[i].surname,
dincat: filteredObjects[i].dincat,
};
var index = userArray.indexOf(user);
if (index = -1) {
userArray.push(user);
}
}
不起作用,因为您在循环中创建的user
对象与您在userArray
中添加的任何对象都不同。它们可能包含相同的键和值,但严格来说 (===( 它们并不相同。
为了帮助您的代码,您可以添加一个用户映射对象:
var userArray = new Array(),
userMap = {};
for (var i = 0, item; item = filteredObjects[i]; ++i) {
var userKey = item.forname + '-' + item.surname + '-' + item.dincat;
if (!(userKey in userMap)) {
userArray.push({
forname: filteredObjects[i].forname,
surname: filteredObjects[i].surname,
dincat: filteredObjects[i].dincat,
});
userMap[userKey] = true;
}
}
用户映射是一个对象,它使用其键来确定您之前是否已插入用户。这通过选择用户标识符来工作,在您的情况下是名字、姓氏和 dincat 的组合。
indexOf 使用严格相等性将搜索元素与数组元素进行比较。如果两个操作数都是对象,则将它们作为对象进行比较,并且仅当两个操作数都引用同一对象时,相等性检验才为真。在您的情况下,您每次都会创建一个新对象并将其与数组中的现有对象进行比较,它将返回 false。
那里有几个语法错误,但代码不起作用的主要原因是你正在做的是创建一个新对象,其中包含你当前在数组循环中的对象的值,然后在数组中查找那个新对象,所以它永远不会存在。
我自己实际上有点好奇是否有更有效的解决方案,但一种可能性是
var demo = [
{a: 'green', b: 'blue', c:'red'},
{a: 'blue', b: 'green', c: 'not blue'},
{a: 'green', b: 'blue', c: 'red'}
],
records= {};
for (var i=0; i<demo.length; i++){
if (records.hasOwnProperty(demo[i].a) &&
records[demo[i].a].hasOwnProperty(demo[i].b) &&
records[demo[i].a][demo[i].b].hasOwnProperty(demo[i].c)
){
//do something with a match
} else {
if (!records.hasOwnProperty(demo[i].a))
records[demo[i].a] = {};
if (!records[demo[i].a].hasOwnProperty(demo[i].b))
records[demo[i].a][demo[i].b] = {};
records[demo[i].a][demo[i].b][demo[i].c] = 'yes';
//no match found
}
}
只需将您的值替换为 a、b 和 c,它应该可以工作。
- 如何在javascript中记录对象时强制使用toString
- 循环浏览JavaScript对象并记录其属性
- 在对象数组中添加具有相同名称的产品记录的价格
- 如何使用Immutable.js从javascript原始对象创建记录映射
- 什么是声明性环境记录,它与激活对象有何不同
- 错误:'历史记录.适配器'为null或不是对象
- 日志记录功能/对象名称's在函数堆栈内的javascript中
- 如何读取mysql表记录并存储在javascript对象中
- 使用单引号(撇号)转义将活动记录对象解析为 json
- JSDoc:如何记录父“类”的“选项”对象文字
- 如何从 javascript 对象中删除记录
- 在新的 Array Javascript 中对对象中的部分重复对象进行计数和记录
- Docusign / Salesforce:从 Salesforce 自定义对象发送信封会给出错误消息“记录中没有联系人
- 无法从 javascript 中的对象获取属性,但在记录其父级时可以将其打印到控制台
- 类型错误:“replaceState”调用了未实现接口历史记录的对象
- 将对象数组记录为 JSDoc 中回调函数的参数
- 使用单个查询将多个记录插入到 webSQL 表中,来自对象数组的数据
- 如何记录JavaScript对象(从UML的角度来看)
- 当Mocha Test失败时,它将一个对象记录到控制台
- 从对象记录特定的属性值