JavaScript:删除共享相同属性值的对象的重复项

Lau*_*n F 26 javascript arrays object key-value angularjs

我有一个对象数组,我想根据特定的key:value对减少.我想创建一个数组,每个特定key:value对只包含一个对象.将重复项的哪个对象复制到新数组并不一定重要.

例如,我想根据price属性修剪arrayWithDuplicates,创建一个只包含每个值之一的新数组:

var arrayWithDuplicates = [
  {"color":"red", 
    "size": "small",
    "custom": {
      "inStock": true,
      "price": 10
    }
  },
  {"color":"green", 
    "size": "small",
    "custom": {
      "inStock": true,
      "price": 30
    }
  },
  {"color":"blue", 
    "size": "medium",
    "custom": {
      "inStock": true,
      "price": 30
    }
  },
  {"color":"red", 
    "size": "large",
    "custom": {
      "inStock": true,
      "price": 20
    }
  }
];
Run Code Online (Sandbox Code Playgroud)

会成为:

var trimmedArray = [
  {"color":"red", 
    "size": "small",
    "custom": {
      "inStock": true,
      "price": 10
    }
  },
  {"color":"green", 
    "size": "small",
    "custom": {
      "inStock": true,
      "price": 30
    }
  },
  {"color":"red", 
    "size": "large",
    "custom": {
      "inStock": true,
      "price": 20
    }
  }
];
Run Code Online (Sandbox Code Playgroud)

是否有JavaScript或Angular函数可以循环执行此操作?

编辑:要过滤的属性嵌套在另一个属性中.

Tam*_*dus 27

function removeDuplicatesBy(keyFn, array) {
  var mySet = new Set();
  return array.filter(function(x) {
    var key = keyFn(x), isNew = !mySet.has(key);
    if (isNew) mySet.add(key);
    return isNew;
  });
}
Run Code Online (Sandbox Code Playgroud)

用法(EcmaScript6箭头功能使它看起来更好):

removeDuplicatesBy(x => x.custom.price, yourArrayWithDuplicates);
Run Code Online (Sandbox Code Playgroud)

编辑:编辑片段不使用属性名称,但使用键选择器功能,因此您可以达到嵌套属性.


yve*_*era 12

我不认为Angular中有内置函数,但创建一个函数并不难:

function removeDuplicates(originalArray, objKey) {
  var trimmedArray = [];
  var values = [];
  var value;

  for(var i = 0; i < originalArray.length; i++) {
    value = originalArray[i][objKey];

    if(values.indexOf(value) === -1) {
      trimmedArray.push(originalArray[i]);
      values.push(value);
    }
  }

  return trimmedArray;

}
Run Code Online (Sandbox Code Playgroud)

用法:

removeDuplicates(arrayWithDuplicates, 'size');
Run Code Online (Sandbox Code Playgroud)

返回:

[
    {
        "color": "red",
        "size": "small"
    },
    {
        "color": "blue",
        "size": "medium"
    },
    {
        "color": "red",
        "size": "large"
    }
]
Run Code Online (Sandbox Code Playgroud)

removeDuplicates(arrayWithDuplicates, 'color');
Run Code Online (Sandbox Code Playgroud)

返回:

[
    {
        "color": "red",
        "size": "small"
    },
    {
        "color": "green",
        "size": "small"
    },
    {
        "color": "blue",
        "size": "medium"
    }
]
Run Code Online (Sandbox Code Playgroud)


gil*_*ly3 8

使用Array.filter(),通过使用Object作为哈希来跟踪值,并过滤掉其值已包含在哈希中的任何项目.

function trim(arr, key) {
    var values = {};
    return arr.filter(function(item){
        var val = item[key];
        var exists = values[val];
        values[val] = true;
        return !exists;
    });
}
Run Code Online (Sandbox Code Playgroud)


use*_*966 5

您可以为此使用下划线

//by size:
var uSize = _.uniq(arrayWithDuplicates, function(p){ return p.size; });

//by custom.price;
var uPrice = _.uniq(arrayWithDuplicates, function(p){ return p.custom.price; });
Run Code Online (Sandbox Code Playgroud)

  • 它已更改为_.uniqBy,并获得了“唯一”属性名称。_.uniqBy([{'x':1},{'x':2},{'x':1}],'x'); // =&gt; [{'x':1},{'x':2}] (2认同)