Javascript,从数组中的两个类似对象之一中删除属性

时间:2016-08-09 10:07:07

标签: javascript angularjs

假设我们有这个数据集:

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属性。我该如何解决?

6 个答案:

答案 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并仅返回名称,否则我们返回值本身

&#13;
&#13;
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;
&#13;
&#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);