How to find in an array from right without reversing?
I have an array that contains version numbers. They are sorted, but sparse. An example could look like this:
const versions = [
{ version: 1, data: { ... }},
{ version: 3, data: { ... }},
{ version: 17, data: { ... }},
{ version: 95, data: { ... }}
];
Now if I want to access version 17
, things are easy:
const data = versions.find(item => item.version === 17);
But what if I want to access version 16
, e.g.? From the domain point of view what I would like to get is the highest version that was released before the desired version, in this case version 3
.
If we combine both queries, this basically means that I am looking for the last entry in the array that is <=
the desired version. Now the problem is: How to do that efficiently.
Things would be really easy if there was a findRight
function on arrays, because then I could write:
const data = version.findRight(item => item.version <= 16);
This would return version 3
. If we ran the same command with 17
, it would return version 17
. The only problem here is: There is no findRight
function in JavaScript 😔
I can think of two possible workarounds:
- First,
reverse
the array, and then use the normalfind
function. This unfortunately becomes quite slow, as I need to run this query lots of times in a loop for different version arrays. - Second, implement a custom
findRight
function. This would work, but this sounds like solving a problem that has already been solved by someone else.
Before I go to implement my own function – is there a better (i.e. faster) approach that works with pure JavaScript and without npm modules?
javascript arrays
add a comment |
I have an array that contains version numbers. They are sorted, but sparse. An example could look like this:
const versions = [
{ version: 1, data: { ... }},
{ version: 3, data: { ... }},
{ version: 17, data: { ... }},
{ version: 95, data: { ... }}
];
Now if I want to access version 17
, things are easy:
const data = versions.find(item => item.version === 17);
But what if I want to access version 16
, e.g.? From the domain point of view what I would like to get is the highest version that was released before the desired version, in this case version 3
.
If we combine both queries, this basically means that I am looking for the last entry in the array that is <=
the desired version. Now the problem is: How to do that efficiently.
Things would be really easy if there was a findRight
function on arrays, because then I could write:
const data = version.findRight(item => item.version <= 16);
This would return version 3
. If we ran the same command with 17
, it would return version 17
. The only problem here is: There is no findRight
function in JavaScript 😔
I can think of two possible workarounds:
- First,
reverse
the array, and then use the normalfind
function. This unfortunately becomes quite slow, as I need to run this query lots of times in a loop for different version arrays. - Second, implement a custom
findRight
function. This would work, but this sounds like solving a problem that has already been solved by someone else.
Before I go to implement my own function – is there a better (i.e. faster) approach that works with pure JavaScript and without npm modules?
javascript arrays
2
Return an array that contains all versions smaller than 17 and then take the last item from that array.
– Kokodoko
Nov 15 '18 at 10:50
@Kokodoko Thanks for this idea, but this is less efficient than running afind
, as afilter
needs to process the entire array, and doesn't stop at the desired item. So yes, from a technical point of view it works, but I would like to have a more performant solution here.
– Golo Roden
Nov 15 '18 at 11:06
add a comment |
I have an array that contains version numbers. They are sorted, but sparse. An example could look like this:
const versions = [
{ version: 1, data: { ... }},
{ version: 3, data: { ... }},
{ version: 17, data: { ... }},
{ version: 95, data: { ... }}
];
Now if I want to access version 17
, things are easy:
const data = versions.find(item => item.version === 17);
But what if I want to access version 16
, e.g.? From the domain point of view what I would like to get is the highest version that was released before the desired version, in this case version 3
.
If we combine both queries, this basically means that I am looking for the last entry in the array that is <=
the desired version. Now the problem is: How to do that efficiently.
Things would be really easy if there was a findRight
function on arrays, because then I could write:
const data = version.findRight(item => item.version <= 16);
This would return version 3
. If we ran the same command with 17
, it would return version 17
. The only problem here is: There is no findRight
function in JavaScript 😔
I can think of two possible workarounds:
- First,
reverse
the array, and then use the normalfind
function. This unfortunately becomes quite slow, as I need to run this query lots of times in a loop for different version arrays. - Second, implement a custom
findRight
function. This would work, but this sounds like solving a problem that has already been solved by someone else.
Before I go to implement my own function – is there a better (i.e. faster) approach that works with pure JavaScript and without npm modules?
javascript arrays
I have an array that contains version numbers. They are sorted, but sparse. An example could look like this:
const versions = [
{ version: 1, data: { ... }},
{ version: 3, data: { ... }},
{ version: 17, data: { ... }},
{ version: 95, data: { ... }}
];
Now if I want to access version 17
, things are easy:
const data = versions.find(item => item.version === 17);
But what if I want to access version 16
, e.g.? From the domain point of view what I would like to get is the highest version that was released before the desired version, in this case version 3
.
If we combine both queries, this basically means that I am looking for the last entry in the array that is <=
the desired version. Now the problem is: How to do that efficiently.
Things would be really easy if there was a findRight
function on arrays, because then I could write:
const data = version.findRight(item => item.version <= 16);
This would return version 3
. If we ran the same command with 17
, it would return version 17
. The only problem here is: There is no findRight
function in JavaScript 😔
I can think of two possible workarounds:
- First,
reverse
the array, and then use the normalfind
function. This unfortunately becomes quite slow, as I need to run this query lots of times in a loop for different version arrays. - Second, implement a custom
findRight
function. This would work, but this sounds like solving a problem that has already been solved by someone else.
Before I go to implement my own function – is there a better (i.e. faster) approach that works with pure JavaScript and without npm modules?
javascript arrays
javascript arrays
asked Nov 15 '18 at 10:45
Golo RodenGolo Roden
59.5k59210310
59.5k59210310
2
Return an array that contains all versions smaller than 17 and then take the last item from that array.
– Kokodoko
Nov 15 '18 at 10:50
@Kokodoko Thanks for this idea, but this is less efficient than running afind
, as afilter
needs to process the entire array, and doesn't stop at the desired item. So yes, from a technical point of view it works, but I would like to have a more performant solution here.
– Golo Roden
Nov 15 '18 at 11:06
add a comment |
2
Return an array that contains all versions smaller than 17 and then take the last item from that array.
– Kokodoko
Nov 15 '18 at 10:50
@Kokodoko Thanks for this idea, but this is less efficient than running afind
, as afilter
needs to process the entire array, and doesn't stop at the desired item. So yes, from a technical point of view it works, but I would like to have a more performant solution here.
– Golo Roden
Nov 15 '18 at 11:06
2
2
Return an array that contains all versions smaller than 17 and then take the last item from that array.
– Kokodoko
Nov 15 '18 at 10:50
Return an array that contains all versions smaller than 17 and then take the last item from that array.
– Kokodoko
Nov 15 '18 at 10:50
@Kokodoko Thanks for this idea, but this is less efficient than running a
find
, as a filter
needs to process the entire array, and doesn't stop at the desired item. So yes, from a technical point of view it works, but I would like to have a more performant solution here.– Golo Roden
Nov 15 '18 at 11:06
@Kokodoko Thanks for this idea, but this is less efficient than running a
find
, as a filter
needs to process the entire array, and doesn't stop at the desired item. So yes, from a technical point of view it works, but I would like to have a more performant solution here.– Golo Roden
Nov 15 '18 at 11:06
add a comment |
8 Answers
8
active
oldest
votes
You can also use "reduceRight" for this like below
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
Thanks for this suggestion, butreduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(
– Golo Roden
Nov 15 '18 at 11:08
1
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
1
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
1
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
add a comment |
You can use Array.findIndex()
to get the index of targeted item and then use it to get before release element.
The
findIndex()
method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating no element passed the test
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
What if I want to search16
, not17
?
– Golo Roden
Nov 15 '18 at 11:16
add a comment |
You can take last item from the filtered array which is nothing but the previous version:
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
You could create a generator, which returns the elements from the right side.
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
just use reduceRight()
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
Try this one, hope it helps.
console.log( versions.find((item, index, arr) => item.version <= 16 && arr[index+1].version > 16) );
https://jsfiddle.net/dummy9807/o0z5xvrk/8/
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
If we presume that next is true:
- Array is sorted
- We will always search for an existing item
then You could use the index of the current item:
e.g.
var data = versions.find((element, index, array) => { return array[index+1].version === 17 });
This way you will get element before the version your are looking for.
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
add a comment |
How about using a filter and get the last element
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53317653%2fhow-to-find-in-an-array-from-right-without-reversing%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
8 Answers
8
active
oldest
votes
8 Answers
8
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can also use "reduceRight" for this like below
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
Thanks for this suggestion, butreduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(
– Golo Roden
Nov 15 '18 at 11:08
1
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
1
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
1
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
add a comment |
You can also use "reduceRight" for this like below
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
Thanks for this suggestion, butreduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(
– Golo Roden
Nov 15 '18 at 11:08
1
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
1
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
1
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
add a comment |
You can also use "reduceRight" for this like below
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
You can also use "reduceRight" for this like below
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
const versions = [
{ version: 1, data: 1},
{ version: 3, data: 3},
{ version: 17, data: 17},
{ version: 95, data: 95}
];
function getNextVersion(v) {
return versions.slice(0).reduceRight((a , b, i , arr) => b.version <= v ? (arr.length = 0, b) : b)
}
console.log(getNextVersion(16))
console.log(getNextVersion(17))
console.log(getNextVersion(18))
console.log(getNextVersion(2))
edited Nov 15 '18 at 16:35
answered Nov 15 '18 at 11:06
Nitish NarangNitish Narang
2,9601815
2,9601815
Thanks for this suggestion, butreduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(
– Golo Roden
Nov 15 '18 at 11:08
1
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
1
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
1
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
add a comment |
Thanks for this suggestion, butreduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(
– Golo Roden
Nov 15 '18 at 11:08
1
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
1
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
1
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
Thanks for this suggestion, but
reduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(– Golo Roden
Nov 15 '18 at 11:08
Thanks for this suggestion, but
reduceRight
always processes the entire array, and does not stop at the correct one. This could be a performance problem, unfortunately :-(– Golo Roden
Nov 15 '18 at 11:08
1
1
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
No this would stop when it finds the result. That's why I have intentionally did .slice() and arr.length = 0
– Nitish Narang
Nov 15 '18 at 11:09
1
1
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
By doing .slice makes a copy and send it as 4th parameter in "reduce" and when we get the desired result we just return result and empty that copied array. This way entire array is not processed. At least this is what I think so. :)
– Nitish Narang
Nov 15 '18 at 11:12
1
1
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
Aaahhhhh! Now I got it! This is pretty clever 👍
– Golo Roden
Nov 15 '18 at 11:21
add a comment |
You can use Array.findIndex()
to get the index of targeted item and then use it to get before release element.
The
findIndex()
method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating no element passed the test
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
What if I want to search16
, not17
?
– Golo Roden
Nov 15 '18 at 11:16
add a comment |
You can use Array.findIndex()
to get the index of targeted item and then use it to get before release element.
The
findIndex()
method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating no element passed the test
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
What if I want to search16
, not17
?
– Golo Roden
Nov 15 '18 at 11:16
add a comment |
You can use Array.findIndex()
to get the index of targeted item and then use it to get before release element.
The
findIndex()
method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating no element passed the test
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
You can use Array.findIndex()
to get the index of targeted item and then use it to get before release element.
The
findIndex()
method returns the index of the first element in the array that satisfies the provided testing function. Otherwise, it returns -1, indicating no element passed the test
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
var index = versions.findIndex(item => item.version === 17);
console.log(versions[index - 1])
answered Nov 15 '18 at 10:51
SatpalSatpal
118k10104135
118k10104135
What if I want to search16
, not17
?
– Golo Roden
Nov 15 '18 at 11:16
add a comment |
What if I want to search16
, not17
?
– Golo Roden
Nov 15 '18 at 11:16
What if I want to search
16
, not 17
?– Golo Roden
Nov 15 '18 at 11:16
What if I want to search
16
, not 17
?– Golo Roden
Nov 15 '18 at 11:16
add a comment |
You can take last item from the filtered array which is nothing but the previous version:
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
You can take last item from the filtered array which is nothing but the previous version:
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
You can take last item from the filtered array which is nothing but the previous version:
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
You can take last item from the filtered array which is nothing but the previous version:
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
const versions = [
{ version: 1, data: { }},
{ version: 3, data: { }},
{ version: 17, data: { }},
{ version: 95, data: { }}
];
const data = versions.filter((item,idx) => item.version < 17);
const previousV = data[data.length -1];
console.log(previousV);
answered Nov 15 '18 at 10:51
MamunMamun
28.8k71831
28.8k71831
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
You could create a generator, which returns the elements from the right side.
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
You could create a generator, which returns the elements from the right side.
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
You could create a generator, which returns the elements from the right side.
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
You could create a generator, which returns the elements from the right side.
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
function* iterRight(array) {
var i = array.length;
while (i--) yield array[i];
}
const versions = [{ version: 1, data: {} }, { version: 3, data: {} }, { version: 17, data: {} }, { version: 95, data: {} }];
var item;
for (item of iterRight(versions)) {
if (item.version <= 16) break;
}
console.log(item);
answered Nov 15 '18 at 10:52
Nina ScholzNina Scholz
190k1599173
190k1599173
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
This is an interesting idea, but introducing a generator function seems to be a little overkill here. Nevertheless, great idea!
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
just use reduceRight()
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
just use reduceRight()
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
just use reduceRight()
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
just use reduceRight()
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
const versions = [
{ version: 1, data: {}},
{ version: 3, data: {}},
{ version: 17, data: {}},
{ version: 95, data: {}}
];
console.log(versions.reduceRight((a,b) => a.version <= 16 ? a : b ));
answered Nov 15 '18 at 10:53
Artyom AmiryanArtyom Amiryan
1,9621214
1,9621214
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:23
add a comment |
Try this one, hope it helps.
console.log( versions.find((item, index, arr) => item.version <= 16 && arr[index+1].version > 16) );
https://jsfiddle.net/dummy9807/o0z5xvrk/8/
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
Try this one, hope it helps.
console.log( versions.find((item, index, arr) => item.version <= 16 && arr[index+1].version > 16) );
https://jsfiddle.net/dummy9807/o0z5xvrk/8/
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
Try this one, hope it helps.
console.log( versions.find((item, index, arr) => item.version <= 16 && arr[index+1].version > 16) );
https://jsfiddle.net/dummy9807/o0z5xvrk/8/
Try this one, hope it helps.
console.log( versions.find((item, index, arr) => item.version <= 16 && arr[index+1].version > 16) );
https://jsfiddle.net/dummy9807/o0z5xvrk/8/
answered Nov 15 '18 at 10:58
Sagar Bahadur TamangSagar Bahadur Tamang
742419
742419
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
This is IMHO the second-best answer. It works, stops early, but its only drawback is that it processes the array from left to right (which in my case is worse than processing it from right to left, as newer versions are more often needed than older ones).
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
If we presume that next is true:
- Array is sorted
- We will always search for an existing item
then You could use the index of the current item:
e.g.
var data = versions.find((element, index, array) => { return array[index+1].version === 17 });
This way you will get element before the version your are looking for.
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
add a comment |
If we presume that next is true:
- Array is sorted
- We will always search for an existing item
then You could use the index of the current item:
e.g.
var data = versions.find((element, index, array) => { return array[index+1].version === 17 });
This way you will get element before the version your are looking for.
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
add a comment |
If we presume that next is true:
- Array is sorted
- We will always search for an existing item
then You could use the index of the current item:
e.g.
var data = versions.find((element, index, array) => { return array[index+1].version === 17 });
This way you will get element before the version your are looking for.
If we presume that next is true:
- Array is sorted
- We will always search for an existing item
then You could use the index of the current item:
e.g.
var data = versions.find((element, index, array) => { return array[index+1].version === 17 });
This way you will get element before the version your are looking for.
answered Nov 15 '18 at 11:03
Senad MeškinSenad Meškin
11.1k43049
11.1k43049
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
add a comment |
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Thanks for your answer! Unfortunately, assumption 2 is not given in my case :-(
– Golo Roden
Nov 15 '18 at 11:07
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
Then you could check if next elemet exists and if it doesn't return false before cobdidion check.
– Senad Meškin
Nov 15 '18 at 11:10
add a comment |
How about using a filter and get the last element
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
How about using a filter and get the last element
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
How about using a filter and get the last element
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
How about using a filter and get the last element
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
const versions = [{
version: 1,
data: {}
},
{
version: 3,
data: {}
},
{
version: 17,
data: {}
},
{
version: 95,
data: {}
}
];
function fun(val) {
let k = versions.filter(item => {
return item.version < val
})
return k[k.length - 1].version
}
console.log(fun(17))
answered Nov 15 '18 at 10:50
brkbrk
28.3k32143
28.3k32143
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
In contrast to the accepted answer this always processes the entire array and doesn't stop early.
– Golo Roden
Nov 15 '18 at 11:24
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53317653%2fhow-to-find-in-an-array-from-right-without-reversing%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
Return an array that contains all versions smaller than 17 and then take the last item from that array.
– Kokodoko
Nov 15 '18 at 10:50
@Kokodoko Thanks for this idea, but this is less efficient than running a
find
, as afilter
needs to process the entire array, and doesn't stop at the desired item. So yes, from a technical point of view it works, but I would like to have a more performant solution here.– Golo Roden
Nov 15 '18 at 11:06