如何从数组中返回不同的对象

How can I return distinct objects from an array?

本文关键字:对象 返回 数组      更新时间:2023-09-26

我使用这种方法(不好)

function unique(objArray){

uArray是临时数组变量,用于将对象保存为字符串

 var uArray=[];  

此函数返回arr

  var arr=[]; 

每个对象都转换为字符串

 for(var i=0;i<objArray.length;i++){
 if(typeof objArray[i] === "object")
 uArray[i]=JSON.stringify(objArray[i]);
 }

将字符串推送到newArray arr

 for( i=0;i<uArray.length;i++){
 if( arr.indexOf(uArray[i]) === -1)
 {
  arr.push(uArray[i]);
 }
 }

将字符串解析为对象

 for(i=0;i<arr.length;i++)
 {
  arr[i]=JSON.parse(arr[i]);
 }
 return arr;
 }

**样本输入阵列**

var users = [
 { 'user': 'barney',  'age': 36, 'active': true },
 { 'user': 'fred',    'age': 40, 'active': false },
  { 'user': 'pebbles', 'age': 1,  'active': true },
 { 'user': 'fred',    'age': 40, 'active': false },
 { 'user': 'salman',    'age': 50, 'active': false },
 { 'user': 'usman',    'age': 44, 'active': false },
 { 'user': 'abrar',    'age': 22, 'active': false },
 {'K1':21, 'k2':22},
 { firstName:'XYZ',lastName'ABC'},`
 { firstName:'XYZ',lastName:'ABC'},
 { firstName:'XYZ1',lastName:'ABC1'}
 ];
      unique(users);

这样试试:

function unique(objArray){
  return objArray.filter(function(inst, i){
      for(var j=i+1; j<objArray.length; j++){
          if(JSON.stringify(objArray[j])==JSON.stringify(inst)) return false;
      }
      return true;
  });
}

FIddle

map将对象转换为字符串,filter将重复对象输出,然后重新map将对象返回。

function unique(arr) {
  return arr.map(function(el) {
    return JSON.stringify(el);
  }).filter(function(e, i, a) {
    return a.indexOf(e) === i;
  }).map(function(el) {
    return JSON.parse(el);
  });
}
unique(users);

演示

我看到您想要从数组中删除重复项。您可以使用下划线unique函数来完成此操作。

我建议您使用下划线javascript实用程序(下面的链接)轻松完成此操作。

使用下划线:

_.uniq(inputArray) // Return unique keys

生成该数组的免费副本。如果阵列具有已分拣

http://underscorejs.org/docs/underscore.html#section-60

此函数的源代码:

  _.uniq = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };

示例:

<script src="//underscorejs.org/underscore-min.js"></script>
<script>
  b={t:'B is Object'}
var a=[1,2,3,3,'4',b,'4',b]
document.write('Before Unique:<br>')
document.write(a)
document.write('<br>')
document.write('After Unique:<br>')
document.write  (_.unique(a))
  </script>