Reputation: 21517
Set seems like a nice way to create Arrays with guaranteed unique elements, but it does not expose any good way to get properties, except for generator [Set].values, which is called in an awkward way of mySet.values.next()
.
This would have been ok, if you could call map
and similar functions on Sets. But you cannot do that, as well.
I've tried Array.from
, but seems to be converting only array-like (NodeList and TypedArrays ?) objects to Array. Another try: Object.keys
does not work for Sets, and Set.prototype does not have similar static method.
So, the question: Is there any convenient inbuilt method for creating an Array with values of a given Set ? (Order of element does not really matter).
if no such option exists, then maybe there is a nice idiomatic one-liner for doing that ? like, using for...of
, or similar ?
Upvotes: 950
Views: 738217
Reputation: 741
As a web dev newcomer, I've been experimenting with Sets.
mySet = new Set([1, 2, 3, 4, 5]);
Create an array from values in a Set:
const myArray = [...mySet];
Transform values in a Set using map method to an array:
const myArray = [...mySet].map((x) => x * 2);
After transforming with map method, maybe you want to store them back in a Set to use the newer Set instance methods like intersection()
or difference()
etc:
const transformedSet = new Set([...mySet].map((x) => x * 2));
Here's an example of transforming the values of a Set of objects instead of a simple array of numbers:
mySet = new Set([
{ name: "John", age: 22 },
{ name: "Jane", age: 25 },
]);
const transformedSet = new Set(
[...mySet].map((x) => ({ ...x, name: x.name.toUpperCase() })),
);
Upvotes: 0
Reputation: 318332
if no such option exists, then maybe there is a nice idiomatic one-liner for doing that ? like, using
for...of
, or similar ?
Indeed, there are several ways to convert a Set to an Array:
Array.from
:Note: safer for TypeScript.
const array = Array.from(mySet);
spreading
the Set out in an array:Note: Spreading a Set has issues when compiled with TypeScript (See issue #8856). It's safer to use Array.from
above instead.
const array = [...mySet];
forEach
):const array = [];
mySet.forEach(v => array.push(v));
Upvotes: 1608
Reputation: 81
function countUniqueValues(arr) {
return Array.from(new Set(arr)).length
}
console.log(countUniqueValues([1, 2, 3, 4, 4, 4, 7, 7, 12, 12, 13]))
Upvotes: -2
Reputation: 31
I would prefer to start with removing duplications from an array and then try to sort. Return the 1st element from new array.
function processData(myArray) {
var s = new Set(myArray);
var arr = [...s];
return arr.sort((a,b) => b-a)[1];
}
console.log(processData([2,3,6,6,5]);
Upvotes: 0
Reputation: 31
The code below creates a set from an array and then, using the ...
operator.
var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
var set=new Set(arr);
let setarr=[...set];
console.log(setarr);
Upvotes: 1
Reputation: 2607
Here is an easy way to get only unique raw values from array. If you convert the array to Set and after this, do the conversion from Set to array. This conversion works only for raw values, for objects in the array it is not valid. Try it by yourself.
let myObj1 = {
name: "Dany",
age: 35,
address: "str. My street N5"
}
let myObj2 = {
name: "Dany",
age: 35,
address: "str. My street N5"
}
var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
console.log(myArray);
var mySet = new Set(myArray);
console.log(mySet);
console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items
let uniqueArray = [...mySet];
console.log(uniqueArray);
// Here you will see your new array have only unique elements with raw
// values. The objects are not filtered as unique values by Set.
// Try it by yourself.
Upvotes: -1
Reputation: 104870
Using Set and converting it to an array is very similar to copying an Array...
So you can use the same methods for copying an array which is very easy in ES6
For example, you can use ...
Imagine you have this Set below:
const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);
You can simply convert it using:
const b = [...a];
and the result is:
["Alireza", "Dezfoolian", "is", "a", "developer"]
An array and now you can use all methods that you can use for an array...
Other common ways of doing it:
const b = Array.from(a);
or using loops like:
const b = [];
a.forEach(v => b.push(v));
Upvotes: 0
Reputation: 9721
Perhaps to late to the party, but you could just do the following:
const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);
This should work without problems in browsers that have support for ES6 or if you have a shim that correctly polyfills the above functionality.
Edit: Today you can just use what @c69 suggests:
const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Upvotes: 12
Reputation: 171
In my case the solution was:
var testSet = new Set();
var testArray = [];
testSet.add("1");
testSet.add("2");
testSet.add("2"); // duplicate item
testSet.add("3");
var someFunction = function (value1, value2, setItself) {
testArray.push(value1);
};
testSet.forEach(someFunction);
console.log("testArray: " + testArray);
Worked under IE11.
Upvotes: 0
Reputation: 608
Assuming you are just using Set
temporarily to get unique values in an array and then converting back to an Array, try using this:
_.uniq([])
This relies on using underscore or lo-dash.
Upvotes: 18
Reputation: 21517
via https://speakerdeck.com/anguscroll/es6-uncensored by Angus Croll
It turns out, we can use spread
operator:
var myArr = [...mySet];
Or, alternatively, use Array.from
:
var myArr = Array.from(mySet);
Upvotes: 103