简体   繁体   English

从数组中获取元素,直到条件匹配

[英]Get elements from array untill a condition matches

I have an array like this 我有这样的数组

var arr = [
    "/a_3312368_392921_800MHz", 
    "/a_3312368_392853_900MHz", 
    "/a_3312368_578261_1GHz", 
    "/a_3312368_578189_120GHz", 
    "/a_3312368_578167_140GHz", 
    "/a_3312368_578230_160GHz", 
    "/a_3312368_578192_180GHz", 
    "/a_3312368_397393_183GHz", 
    "/a_3312368_582870_186GHz", 
    "/a_3312368_578174_190GHz", 
    "/a_3312368_578177_2GHz", 
    "/a_3312368_578922_210GHz", 
    "/a_3312368_578479_220GHz", 
    "/a_3312368_578357_226GHz", 
    "/a_3312368_578182_240GHz", 
    "/a_3312368_578919_250GHz", 
    "/a_3312368_578349_253GHz", 
    "/a_3312368_578639_280GHz", 
    "/a_3312368_579178_3GHz"
];

I need to get value on an operator selection. 我需要从操作员选择中获得价值。 I have some operators like this 我有一些这样的运营商

`> , < , = , <= , >=`

And here is the selected value for example 这是例如选择的值

var selection = "/a_3312368_578189_120GHz";

My current operator for instance 例如我目前的运营商

var operator = ">";

This is some code i have written. 这是我写的一些代码。

var string_array = [];
for(var i = 0; i < arr.length; i++){
    if(selection == arr[i]){
        break;
    }
    string_array.push(arr[i]);
}
console.log(string_array);

It is giving me proper results. 它给了我适当的结果。 But when i am trying it with map it produces error Can't have break outside of loop . 但是当我用map尝试它时会产生错误Can't have break outside of loop

string_array = arr.map(function(item) {  if (selection == item){ break; }  else {return item;} });

How can i write a one line code for this. 我如何为此编写一行代码。

Fiddle Link 小提琴链接

Well… you can't break map. 好吧...你不能破坏地图。 Don't use map . 不要使用map Use some or every . 使用一些每一个

Example - some: - some will break when the callback returns true 示例-一些: - some在回调返回true时会中断

arr.some(function (item) {if (selection == item) {return true;}});    

 var selection = "/a_3312368_578189_120GHz"; var arr = ["/a_3312368_392921_800MHz", "/a_3312368_392853_900MHz", "/a_3312368_578261_1GHz", "/a_3312368_578189_120GHz", "/a_3312368_578167_140GHz", "/a_3312368_578230_160GHz", "/a_3312368_578192_180GHz", "/a_3312368_397393_183GHz", "/a_3312368_582870_186GHz", "/a_3312368_578174_190GHz", "/a_3312368_578177_2GHz", "/a_3312368_578922_210GHz", "/a_3312368_578479_220GHz", "/a_3312368_578357_226GHz", "/a_3312368_578182_240GHz", "/a_3312368_578919_250GHz", "/a_3312368_578349_253GHz", "/a_3312368_578639_280GHz", "/a_3312368_579178_3GHz" ]; string_array = []; arr.some(function(item) { if (selection == item){ return true; }else{string_array.push(item);} }); console.log(string_array); 

Example-every: - every will break when the callback returns false 每个示例: -当回调返回false时, every 示例都会中断

arr.every(function(item) { if (selection == item) {return false;}});  

 var selection = "/a_3312368_578189_120GHz"; var arr = ["/a_3312368_392921_800MHz", "/a_3312368_392853_900MHz", "/a_3312368_578261_1GHz", "/a_3312368_578189_120GHz", "/a_3312368_578167_140GHz", "/a_3312368_578230_160GHz", "/a_3312368_578192_180GHz", "/a_3312368_397393_183GHz", "/a_3312368_582870_186GHz", "/a_3312368_578174_190GHz", "/a_3312368_578177_2GHz", "/a_3312368_578922_210GHz", "/a_3312368_578479_220GHz", "/a_3312368_578357_226GHz", "/a_3312368_578182_240GHz", "/a_3312368_578919_250GHz", "/a_3312368_578349_253GHz", "/a_3312368_578639_280GHz", "/a_3312368_579178_3GHz" ]; string_array = []; arr.every(function(item) {if (selection != item){string_array.push(item);} return item.indexOf(selection) == -1; }); console.log(string_array); 

When you use map result array have same element count as source. 当您使用map结果数组时,其元素数与源数相同。
What you want is just filter array, so use filter function. 您想要的只是过滤器数组,因此请使用filter功能。

Also if your source array sorter, so operator just show relation with index of selected element. 另外,如果您的源数组排序器,则运算符仅显示与所选元素的索引的关系。

So your code should be like this 所以你的代码应该像这样

var selection = "/a_3312368_578189_120GHz";
var indexSelected = arr.indexOf(selection)
string_array = arr.filter(function(el, index){
    return index < indexSelected;
});

 var arr = [ "/a_3312368_392921_800MHz", "/a_3312368_392853_900MHz", "/a_3312368_578261_1GHz", "/a_3312368_578189_120GHz", "/a_3312368_578167_140GHz", "/a_3312368_578230_160GHz", "/a_3312368_578192_180GHz", "/a_3312368_397393_183GHz", "/a_3312368_582870_186GHz", "/a_3312368_578174_190GHz", "/a_3312368_578177_2GHz", "/a_3312368_578922_210GHz", "/a_3312368_578479_220GHz", "/a_3312368_578357_226GHz", "/a_3312368_578182_240GHz", "/a_3312368_578919_250GHz", "/a_3312368_578349_253GHz", "/a_3312368_578639_280GHz", "/a_3312368_579178_3GHz" ]; var selection = "/a_3312368_578189_120GHz"; var indexSelected = arr.indexOf(selection); var string_array = arr.filter(function(el,index){ return index < indexSelected; }); document.getElementById('r').innerHTML = JSON.stringify(string_array,null, 2); 
 <pre id="r"></pre> 

As say @Toffy in comment - in your case, seems, you need simple slice 就像在评论中说@Toffy-在您的情况下,您似乎需要简单的slice

var indexSelected = arr.indexOf(selection)
string_array = arr.slice(0,indexSelected);

 var arr = [ "/a_3312368_392921_800MHz", "/a_3312368_392853_900MHz", "/a_3312368_578261_1GHz", "/a_3312368_578189_120GHz", "/a_3312368_578167_140GHz", "/a_3312368_578230_160GHz", "/a_3312368_578192_180GHz", "/a_3312368_397393_183GHz", "/a_3312368_582870_186GHz", "/a_3312368_578174_190GHz", "/a_3312368_578177_2GHz", "/a_3312368_578922_210GHz", "/a_3312368_578479_220GHz", "/a_3312368_578357_226GHz", "/a_3312368_578182_240GHz", "/a_3312368_578919_250GHz", "/a_3312368_578349_253GHz", "/a_3312368_578639_280GHz", "/a_3312368_579178_3GHz" ]; var selection = "/a_3312368_578189_120GHz"; var indexSelected = arr.indexOf(selection); var string_array = arr.slice(0,indexSelected); document.getElementById('r').innerHTML = JSON.stringify(string_array,null, 2); 
 <pre id="r"></pre> 

Sample if source array not sorted 如果源数组未排序,则进行采样

var selection = "/a_3312368_578189_120GHz";
var selectedFreq = getFreq(selection);

function getFreq(s) {
    var parts = s.match(/(\d+)(MHz|GHz)$/);
    return parts[1]* (parts[2] == "GHz" ? 1000: 1);    
}
var string_array = arr.filter(function(el) {
    var elFreq = getFreq(el);
    return selectedFreq > elFreq;
});

 var arr = [ "/a_3312368_392921_800MHz", "/a_3312368_392853_900MHz", "/a_3312368_578261_1GHz", "/a_3312368_578922_210GHz", "/a_3312368_578479_220GHz", "/a_3312368_578357_226GHz", "/a_3312368_578182_240GHz", "/a_3312368_578919_250GHz", "/a_3312368_578349_253GHz", "/a_3312368_578639_280GHz", "/a_3312368_579178_3GHz", "/a_3312368_578189_120GHz", "/a_3312368_578167_140GHz", "/a_3312368_578230_160GHz", "/a_3312368_578192_180GHz", "/a_3312368_397393_183GHz", "/a_3312368_582870_186GHz", "/a_3312368_578174_190GHz", "/a_3312368_578177_2GHz", ]; var selection = "/a_3312368_578189_120GHz"; var selectedFreq = getFreq(selection); function getFreq(s) { var parts = s.match(/(\\d+)(MHz|GHz)$/); return parts[1]* (parts[2] == "GHz" ? 1000: 1); } var string_array = arr.filter(function(el) { var elFreq = getFreq(el); return selectedFreq > elFreq; }); document.getElementById('r').innerHTML = JSON.stringify(string_array, null, 2); 
 <pre id="r"></pre> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM