假设我们有这个数据集:
app_tracker.xml
我想循环遍历数组以查看是否有两个对象具有相同的组值,然后删除其中的第二个。
var array = [
{
"name": "a",
"group": "a"
},
{
"name": "a",
"group": "a"
},{
"name": "b",
"group": "b"
},
{
"name": "b",
"group": "b"
},
{
"name": "c"
}
];
我想要的最终结果是:
for(var i = 0 ; i<array.length;i++){
var a = array[i];
for(var j = 0; j< array.length;j++){
if(array[j].group == a.group){
var b = array[j];
// I need code here to remove property "group" from the variable b only
break;
}
}
}
注意:我尝试var array2 = [
{
"name": "a",
"group": "a"
},
{
"name": "a"
},{
"name": "b",
"group": "b"
},
{
"name": "b"
},{
"name":"c"
}
];
但它导致从两个相等的对象中删除delete array[j].group
属性。我该如何解决?
答案 0 :(得分:2)
你不应该比较相同的项目,只需在内循环中移动索引:
var array = [{"name": "a", "group": "a"},
{"name": "a", "group": "a"},
{"name": "b", "group": "b"},
{"name": "b", "group": "b"},
{"name": "c"}];
for(var i = 0 ; i < array.length - 1; i++){
var a = array[i];
if(!a.group){
continue;
}
for(var j = i+1; j < array.length; j++){
var b = array[j];
if(b.group === a.group){
delete b.group;
}
}
}
console.log(array)
答案 1 :(得分:1)
你可以试试这个:
var tmpObj = {};
tmpObj.name = array[j].name;
array.splice(j, 1, tmpObj);
它应该删除索引为j的元素,并添加仅具有名称的新对象。
答案 2 :(得分:1)
只需存储您已经看过的所有组值,如果再次看到它们,请将其删除。而且,这将为您节省一个循环。
var myArray = [...];
var existingGroups = [];
myArray.forEach(function(item){
if(item.group){
if(existingGroups.indexOf(item.group) === -1)
existingGroups.push(item.group);
else
delete item.group;
}
});
答案 3 :(得分:1)
我采用不同的方法:
对if
条件的一点解释:
array.slice(0, i)
:我们只接受数组的前一个元素。
.filter(v => v.group === val.group)
我们看到它们是否具有相同的属性 group 的值。
.length === 0)
如果至少有一个元素具有相同的group值,我们不输入if并仅返回名称,否则我们返回值本身
var array = [{"name": "a", "group": "a"},
{"name": "a", "group": "a"},
{"name": "b", "group": "b"},
{"name": "b", "group": "b"},
{"name": "c"}];
array = array.map((val, i) => {
if (array.slice(0, i).filter(v => v.group === val.group).length === 0) {
return val;
}
return {name: val.name};
})
console.log(array)
&#13;
答案 4 :(得分:0)
这是一个可能有用的简单代码:
var groups = {};
array.forEach(function(o) {
if (groups[o.group]) {
delete o.group;
} else {
groups[o.group] = true;
}
})
您也可以使用更多功能方法,但您需要一个额外的实用程序库,或者必须自己实现一些方法。
var groups = array.map(function(o) { return o.group; }).unique();
groups
.map(function(group) {
return array.filter(function(o) { o.group == group }).slice(1);
})
.flatten()
.forEach(function(o) { delete o.group });
压扁&amp;唯一不包含在JavaScript规范中。
答案 5 :(得分:0)
您不需要使用叠加循环来执行此操作。您可以在跟踪到目前为止遇到的组的同时使用.forEach()
。这可以通过使用可选的thisArg
参数或显式变量来完成。
例如:
var array = [
{ "name": "a", "group": "a" },
{ "name": "a", "group": "a" },
{ "name": "b", "group": "b" },
{ "name": "b", "group": "b" },
{ "name": "c" }
];
var grp = {};
array.forEach(function(o) {
grp[o.group] ? delete o.group : grp[o.group] = true;
});
console.log(array);