删除具有较低特定值的数组项

时间:2014-02-17 09:19:50

标签: javascript arrays

我想让array1转换为array2。 关键字是test,test2,885,length。我希望关键字的下一个值(#?)到下一个#是最高的。

var array1=["4#test#4#T#limited","6#test#6#885#restricted","7#test2#2#2#limited","8#test2#4#3#limited","11#885#1#TT#restricted","15#length#1#taw#restricted","17#885#11#T#limited"];

var arrar2=["6#test#6#885#restricted","8#test2#4#3#limited","17#885#11#T#limited","15#length#1#taw#restricted"];

3 个答案:

答案 0 :(得分:0)

您可以使用underscorejs进行过滤。

http://underscorejs.org/#filter

然后,您可以使用javascript Array的 sort 方法根据需要对数组进行排序。您可以传递自定义排序功能进行排序。 http://www.w3schools.com/jsref/jsref_sort.asp

答案 1 :(得分:0)

这是你想要的吗?

var array1=["4#test#4#T#limited","6#test#6#885#restricted","7#test2#2#2#limited","8#test2#4#3#limited","11#885#1#TT#restricted","15#length#1#taw#restricted","17#885#11#T#limited"];
var keywords = ["test","test2","885","length"];
var array2 = [];
keywords.forEach(function (key) {
    var matched = [];
    var regex = new RegExp("\\b" + key + "#(\\d+)");
    array1.forEach(function (value) {
        if (regex.test(value)) {
            matched.push([parseInt(RegExp.$1), value]);
        }
    });
    if (matched.length > 0) {
        matched.sort(function (a, b) {
            return b[0] - a[0];
        });
        array2.push(matched[0][1]);
    }
});
alert(array2);

JsFiddle example

答案 2 :(得分:0)

根据满足条件的项目“从数组中删除项目”的最简单方法是使用Array.prototype.filter(条件反转)。

在您的情况下,由于您组织数据的方式(将其全部捆绑在一个字符串中使其难以使用),因此很难做到。以下是我将如何处理它,但您可以从一开始就更好地构建数据,以避免尴尬的转换:

var array1=["4#test#4#T#limited","6#test#6#885#restricted","7#test2#2#2#limited","8#test2#4#3#limited","11#885#1#TT#restricted","15#length#1#taw#restricted","17#885#11#T#limited"];

通过提取关键字和值(我还保留一些信息以返回到数组的原始形状),使数据更易于使用:

var saneData = array1.map(function(item, index){
  var split = item.split('#');
  return {
    keyword : split[1],
    value: +split[0],
    original : item,
    originalIndex : index
  }
});

按关键字排序数据(因此所有具有相同关键字的项目彼此相邻)和值(因此最大值首先出现在具有相同关键字的子集中):

saneData.sort(function(a,b){
  if (a.keyword !== b.keyword) {
    return a.keyword.localeCompare(b.keyword);
  } else {
    return b.value - a.value;
  }
});

过滤数组,只保留具有相同关键字的子集中的第一项:

var filteredData = saneData.filter(function(item, index) {
  if (index === 0) return true; // first item is good
  return item.keyword !== saneData[index-1].keyword;
});

返回数组的原始形式(保留顺序):

var array2 = filteredData.sort(function(a,b){ return a.originalIndex - b.originalIndex; }).map(function(item){ return item.original; });

// Result: ["6#test#6#885#restricted", "8#test2#4#3#limited", "15#length#1#taw#restricted", "17#885#11#T#limited"]