从数组中删除类似的对象
Remove similar objects from array
我正在尝试从具有 4 个相同值和 1 个唯一值的数组中删除对象。
快速的谷歌搜索提供了很多选项,可以从数组中删除相同的对象,但不能删除相似的对象。
数组示例:
var data = [
{Date: "2016-04-27T09:03:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
{Date: "2016-04-27T08:07:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
{Date: "2016-04-27T10:23:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"}
]
我尝试使用 lodash _uniq
函数,但它只需要一个属性即可匹配:
var non_duplidated_data = _.uniq(data, 'Name');
除日期外,所有值都相同。如何根据 4 个属性删除相同的对象?
您可以通过两个嵌套循环来执行此操作,这两个嵌套循环将针对自身迭代数组。
var newArray = []; //Result array
//iterate
data.forEach(function(item, index){
var found = false;
//Go through the rest of elements and see if any matches
for (var i = index; i < data.length, i++) {
if (item.name == data[i].name && item.title == data[i].title) // add more fields here
found = true;
}
//Add to the result array if no duplicates found
if (!found)
newArray.push(item);
})
你可以使用普通的Javascript来解决这个问题。只需检查每个属性的每个对象:
Array.prototype.allValuesSame = function() {
for(var i = 1; i < this.length; i++) {
if(this[i] !== this[0])
return false;
}
return true;
}
var data = [
{Date: "2016-04-27T09:03:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
{Date: "2016-04-27T08:07:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
{Date: "2016-04-27T10:23:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"}
]
var tmpPropValues = {};
for (var property in data[0]) {
tmpPropValues[property] = [];
for(var i = 0; i < data.length; i++) {
var obj = data[i];
// store temporary in array
if (obj.hasOwnProperty(property)) {
var value = obj[property];
tmpPropValues[property].push(value);
}
}
if(tmpPropValues[property].allValuesSame()) {
delete tmpPropValues[property];
}
}
for(var prop in tmpPropValues) {
var tmp = document.getElementById("result").innerHTML;
document.getElementById("result").innerHTML = tmp+" "+prop;
}
我为你做了一个小提琴。
使用 .uniq通过 https://lodash.com/docs#uniqBy,它允许自定义条件来单q化你的数组。
这可以帮助您,在此代码中,我首先映射应比较的所有属性,然后减少数组以仅获取唯一记录。
var data = [
{Date: "2016-04-27T09:03:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
{Date: "2016-04-27T08:07:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
{Date: "2016-04-27T10:23:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"}
];
var uniqueRecord = data.map(function(item){
return {Name:item.Name,Title:item.Title,Department: item.Department,Company:item.Company};
}).reduce(function(acc,curr){
if(!Array.isArray(acc)){
var copyOfAcc = JSON.parse(JSON.stringify(acc));
acc = [];
acc.push(copyOfAcc);
}
return (acc.indexOf(curr) > -1) ? acc.push(curr) : acc;
});
结果将是:
[ { Name: 'Tito',
Title: 'Developer',
Department: 'IT',
Company: 'XXX' } ]
然后,您需要定义要保留的日期(第一个,最后一个,哪个?)并再次找到记录,为此,一个简单的"forEach"应该可以工作。
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 解析JSON并从中删除对象会出错
- 如何从对象中删除属性
- 在特定条件下从存储在localStorage中的阵列中删除对象
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 正在从对象中删除值
- 正在从列表中删除对象
- 删除对象时终止setInterval
- jQuery-检测选择对象是否添加或删除了选项
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 为什么没有从数组中存在的对象中删除属性
- 从Three.js场景中删除许多对象的速度较慢
- 删除两个独立对象中的属性,而不使用多余的删除语句
- JS:将 EventListener 添加到动态创建的 DOM 对象中,这些对象删除 parentNode
- Java 脚本 json 解析对象:删除操作后不删除“,”
- JavaScript对象删除特定键值中的引号
- tinyMCE对象删除事件触发器
- javascript地图对象删除不工作
- Javascript对象删除元素