将包含对象的3D数组展平为2D,通过其参数删除重复的对象

时间:2021-12-22 01:59:38

I have a 3D array with objects inside:

我有一个包含对象的3D数组:

[
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
]

How to flatten it including removing duplicated id parameter?

如何展平它包括删除重复的id参数?

[{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }]

I think underscore would be helpful with that

我认为下划线对此有帮助

5 个解决方案

#1


2  

You can use Underscore flatten and unique to accomplish this. However, whenever you are using multiple underscore operations, it is a good time to consider using the underscore chainging with chain and value:

您可以使用Underscore flatten和unique来实现此目的。但是,无论何时使用多个下划线操作,都应该考虑使用带有链和值的下划线链接:

var data = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

var result = _.chain(data)
                  .flatten()
                  .uniq(function(o) {
                      return o.id;
                   })
                  .value();

console.log('result', result);

JSFiddle: http://jsfiddle.net/0udLde0s/3/

Even shorter with current Underscore.js

使用当前的Underscore.js更短

If you use a recent version of Underscore.js (I tried current which is 1.8.3 right now), you can use .uniq('id') so it makes it even shorter:

如果您使用最近版本的Underscore.js(我现在尝试使用当前的1.8.3版本),您可以使用.uniq('id'),因此它会更短:

var result = _.chain(data)
                  .flatten()
                  .uniq('id')
                  .value();

#2


3  

var a = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

var flattened = _(a).flatten().uniq('id').value();

Of course you have to include lodash to your webpage.

当然,您必须将lodash包含在您的网页中。

#3


2  

You can use _.flatten, and _.uniq, like so

您可以像这样使用_.flatten和_.uniq

var data = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

var result = _.uniq(_.flatten(data), function (el) {
    return el.id;
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

#4


0  

You don't need any library for this, it's quite simple:

你不需要任何库,这很简单:

function flatten(arr)
{
  var map = {};
  var flatArray = [];
  function pushToMap(o) {
    if(map[o.id])
      return;
  
    map[o.id] = true;
    flatArray.push(o);
  }
  function arrRecurse(a) {
    if(a.length === undefined)
      pushToMap(a);
    else {
      a.forEach(function(i) {
        arrRecurse(i);
      });
    }
  }

  arrRecurse(arr);
  return flatArray;
}

var _3dArray = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

alert(JSON.stringify(flatten(_3dArray)));

#5


0  

No library, only native JS :

var ar = [
  [{ id: 1 }, { id: 2 }],
  [{ id: 3 }],
  [{ id: 3 }, { id: 4 }]
];

//start
var output = [];
for (var x = 0, al = {}; x < ar.length; x++)
  for (var y = 0, t = ar[x][y]; y < ar[x].length; y++, t = ar[x][y])
      al[t.id] = (!al[t.id]) ? output.push(t) : 1;
//end

document.body.innerHTML += JSON.stringify(output);

#1


2  

You can use Underscore flatten and unique to accomplish this. However, whenever you are using multiple underscore operations, it is a good time to consider using the underscore chainging with chain and value:

您可以使用Underscore flatten和unique来实现此目的。但是,无论何时使用多个下划线操作,都应该考虑使用带有链和值的下划线链接:

var data = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

var result = _.chain(data)
                  .flatten()
                  .uniq(function(o) {
                      return o.id;
                   })
                  .value();

console.log('result', result);

JSFiddle: http://jsfiddle.net/0udLde0s/3/

Even shorter with current Underscore.js

使用当前的Underscore.js更短

If you use a recent version of Underscore.js (I tried current which is 1.8.3 right now), you can use .uniq('id') so it makes it even shorter:

如果您使用最近版本的Underscore.js(我现在尝试使用当前的1.8.3版本),您可以使用.uniq('id'),因此它会更短:

var result = _.chain(data)
                  .flatten()
                  .uniq('id')
                  .value();

#2


3  

var a = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

var flattened = _(a).flatten().uniq('id').value();

Of course you have to include lodash to your webpage.

当然,您必须将lodash包含在您的网页中。

#3


2  

You can use _.flatten, and _.uniq, like so

您可以像这样使用_.flatten和_.uniq

var data = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

var result = _.uniq(_.flatten(data), function (el) {
    return el.id;
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

#4


0  

You don't need any library for this, it's quite simple:

你不需要任何库,这很简单:

function flatten(arr)
{
  var map = {};
  var flatArray = [];
  function pushToMap(o) {
    if(map[o.id])
      return;
  
    map[o.id] = true;
    flatArray.push(o);
  }
  function arrRecurse(a) {
    if(a.length === undefined)
      pushToMap(a);
    else {
      a.forEach(function(i) {
        arrRecurse(i);
      });
    }
  }

  arrRecurse(arr);
  return flatArray;
}

var _3dArray = [
    [{ id: 1 }, { id: 2 }],
    [{ id: 3 }],
    [{ id: 3 }, { id: 4 }]
];

alert(JSON.stringify(flatten(_3dArray)));

#5


0  

No library, only native JS :

var ar = [
  [{ id: 1 }, { id: 2 }],
  [{ id: 3 }],
  [{ id: 3 }, { id: 4 }]
];

//start
var output = [];
for (var x = 0, al = {}; x < ar.length; x++)
  for (var y = 0, t = ar[x][y]; y < ar[x].length; y++, t = ar[x][y])
      al[t.id] = (!al[t.id]) ? output.push(t) : 1;
//end

document.body.innerHTML += JSON.stringify(output);