I have 2 arrays. The first one is simple:
The second one contains sub-arrays:
and every element of the sub-arrays should be concated to the first one so they can form one array of same elements.
Here is sandbox:
https://codesandbox.io/s/smoosh-dust-kpg5l?file=/src/App.js
Arrays are data1 and data2. Final data is how it should look like. I tried several loops to form it but unsuccessfully.
Array#flatMap to the rescue:
const newArr = [...data1, ...data2.flatMap((el) => el)];
Related
when i do console.log(myArray) I obtain this:
console.log result
I want to take a value inside only one of this arrays, but how? When i do console.log(array[0]) I obtain this result:
37.7
28.45
36.38
You have nested arrays. So your main array has three elements each of which contains one number, and the indexes of those arrays go from 0 to 2.
You access each nested array with its index, and then access the number with the 0 index (because there's only one element in that nested array).
const arr = [[37.7], [28.45], [36.38]];
console.log(arr[0][0]);
console.log(arr[1][0]);
console.log(arr[2][0]);
Or even loop over the array and destructure the number from each nested array:
const arr = [[37.7], [28.45], [36.38]];
for (let [number] of arr) {
console.log(number);
}
From what I can see in the original question so far, the output of this function is actually three different console.log() executions, which leads me to believe that whatever is firing these console.logs is actually running in some sort of loop.
If that is the case, you will not be able to pull just one value out to simply. The screenshot you added only shows the output. Could you please add the code for (or screenshot of) all the related code from setting up or fetching the array, to your console.log? With all that context, I can rewrite my answer to get you the exact answer you are looking for.
Please compare your code with this working example:
let myArray = [37.7, 28.45, 36.38];
console.log(myArray[0]); // outputs 37.7
To be able to use setValues() instead of setValue on a high number of rows, I would like to know how can I convert all my arrays into arrays of the same length.
During a map function, I create one giant array that looks like this :
const myArray = [[Monday, Tuesday],[Monday,Tuesday,Wednesday],[Friday],[Monday,Friday],[Tuesday,Wednesday,Friday]] // And so on.
At the moment I use a setValue for each item of the array. The next step would be simply to use setValues(), and append an array but the problem is they are all of different lengths.
result.forEach(function(_,index){
currentSheet.getRange(1+index,5).setValue(result[index]);
});
That is going to do that for 600 lines and I will do it several times with other functions. I can live with it, but it seems like a waste. Is there a way to make the arrays homogenous (all arrays would be have a length of 3 elements, one or two being empty for example) an use one single setValues() instead ?
EDIT : the original map function to create the first array was requested. Here it is :
(Basically what it does is : it runs a map through a first array, look at the first element and go find in the source all the elements that have the same key and return the 9th and 10th elements of that array)
const result = UniquesDatas.map(uniqueRow =>
SourceDatas
.filter(row => row[0] === uniqueRow[0])
.map(row => [row[9]+" "+row[10]])
);
Thank you in advance,
Cedric
You can concat an array of empty elements of the remaining length.
const myArray = [['Monday', 'Tuesday'],['Monday','Tuesday','Wednesday'],['Friday'],['Monday','Friday'],['Tuesday','Wednesday','Friday']]
const res = myArray.map(x => x.concat(Array(3 - x.length)));
console.log(res);
As suggested by Kinglish, to get the length of the inner array with the most elements, use Math.max(...myArray.map(x=>x.length)), which will work for the more general case.
I'm trying to setup a 2-d array, which should receive values at specific sub-arrays. I created my array with:
myArray= Array(100).fill([])
Now, let's say I want to push a value to say sub-array number 40
I'm doing this like that:
myArray[40].push("myValue")
I would expect the value to be pushed only to the myArray[40] instead it is pushed as the first element of every of the hundred sub-arrays.
I searched for the solution for quite some time, but I still have no idea what I'm doing wrong. Please help.
fill will push the same value to each element, not a copy of it. That's fine when it's a number or string or something else immutable. But now each copy is a reference to the same object.
There are a number of ways to fix this. Here's one (switched to ten elements for demonstration):
const myArray = [...Array(10)].map((_, i) => [])
myArray[4].push('myValue')
console.log(myArray)
Why does it say length 1 instead of 4?
The following is what I'm trying to push and slice. I try and append items.image_urls and slice them into 5 each.
items.image_urls is my dictionary array.
var final_push = []
final_push.push(items.image_urls.splice(0,5))
console.log(final_push.length)## gives me 1...?
var index = 0
final_push.forEach(function(results){
index++ ##this gives me one. I would need 1,2,3,4,5,1,2,3,4,5. Somehting along that.
}
items.image_urls looks like this:
It's an iteration of arrays with image urls.
In your example items.image_urls.splice(0,5) returns an array of items removed from items.image_urls. When you call final_push.push(items.image_urls.splice(0,5));, this whole array is pushed as one item to the final_push array, so it now looks like [["url1", "url2", "url3", "url4", "url5"]] (2-dimensional array). You can access this whole array by calling final_push[some_index].
But what you want instead is to add every element of items.image_urls.splice(0,5) to the final_push. You can use a spread operator to achieve this:
final_push.push(...items.image_urls.splice(0,5));
Spread syntax allows an iterable such as an array expression or string
to be expanded in places where zero or more arguments (for function
calls) or elements (for array literals) are expected
This is exactly our case, because push() expects one or more arguments:
arr.push(element1[, ...[, elementN]])
And here is an example:
let items = {
image_urls: ["url1", "url2", "url3", "url4", "url5", "url6", "url7", "url8", "url9", "url10"]
};
let final_push = [];
final_push.push(...items.image_urls.splice(0,5));
console.log(final_push.length);
console.log(JSON.stringify(final_push));
console.log(JSON.stringify(items.image_urls));
Note: do not confuse Array.prototype.slice() with Array.prototype.splice() - the first one returns a shallow copy of a portion of an array into a new array object while the second changes the contents of an array by removing existing elements and/or adding new elements and returns an array containing the deleted elements.
That seems to be a nested array. So if you would access index 0, and then work on that array like below it will probably work:
console.log(final_push[0].length); //should print 4
The author is mixing up splice and slice. Probably a typo :)
You start at the beginning (0) and then delete 5 items.
I have a 2 dimensional array:
var sH = [['two'],['three']]
and I want to add 'one' to the start/top so my array ends up as
[['one'],['two'],['three']]
Using unshift like so
sH[0].unshift('one');
produces an array where 'one is inserted but 'two' is in the second column rather than the first (ie 1 rather than 1[0])
I've looked and searched and experimented but I cannot see how to do this easily.
The statement sH[0].unshift will affect the bound object - which is an array ( the first of the existing two (two, three); which is two)
In other words, using that method you adds the "one" to the first existing child array which is "two", producing
[['one', 'two'], 'three']
To produce [['one'], ['two'], ['three']] you should use sH.unshift('one');
Perhaps I misunderstand, but don't you just want to do the following?
sH.unshift(['one'])
var sH = [['two'],['three']];
sH.unshift(['one']); // [["one"], ["two"], ["three"]]
sH.push(['four']); // [["one"], ["two"], ["three"], ["four"]]
You are doing it wrong with your sh index.
It should be sh.unshift(['one']);
This will insert an array containing "one" string.