数组文本到数字,找到匹配的值和排序

Array text to numbers, find matching values and sort

本文关键字:排序 文本 数字 数组      更新时间:2023-09-26

我有一个像这样的数组:

["1,8", "4,6,8", "8,9", "6,9"]

1/我想把它交给这个

[1,8,4,6,8,8,9,6,9]

2/我想找到匹配的值,通过寻找最多的数字:

[8]

第一个问题已经解决了:

var carArray  = ["1,8", "4,6,8,7,7,7,7", "8,9", "6,9"];
//1) create single array
var arr = carArray.join().split(','); 
//2) find most occurring
var counts = {}; //object to hold count for each occurence    
var max = 0, maxOccurring;
arr.forEach(function(el){     
    var cnt = (counts[el] || 0); //previous count
    counts[el] = ++cnt;
    if(cnt > max && cnt > 1){ //only register if more than once (cnt>1)
        max=cnt;
        maxOccurring = el;
    }
});

if(maxOccurring){
    //there was an element more than once, maxOccuring contains that element
    setResult('Most occuring: ' + maxOccurring + ' (' + max + ' times)');
}
else{
    //3)/4) ???
    setResult('sorting?');
}
//below is only for test display purposes
function setResult(res){
    console.log(res);
}

3/如果没有这样的匹配值

[1,8,4,6,5,7]
然后我需要将这个数组与另一个数组进行比较,比如这个
[6,7,4,1,2,8,9,5]

如果上面<4>数组中的第一个数字出现在<3>数组中,则获取该数字,即在上面的示例中,我需要获得6。<4>数组将是静态值,不会更改。数字<3>将是动态的。

EDIT不是最优雅的答案,但我现在确实有一些工作。我没有直接将原始数组与第二个数组进行比较,而是使用简单的if/else语句来完成我需要的操作:

var carArray  = ["1,5", "4", "8,2", "3,9,1,1,1"];
//1) create single array
var arr = carArray.join().split(','); 
//2) find most occurring
var counts = {}; //object to hold count for each occurence    
var max = 0, maxOccurring;
arr.forEach(function(el){     
    var cnt = (counts[el] || 0); //previous count
    counts[el] = ++cnt;
    if(cnt > max && cnt > 1){ //only register if more than once (cnt>1)
        max=cnt;
        maxOccurring = el;
    }
});
if(maxOccurring){
    //there was an element more than once, maxOccuring contains that element
    console.log('Most occuring: ' + maxOccurring + ' (' + max + ' times)');
    console.log(maxOccurring);
}
else {
    // If not occuring, match from a list
    if(jQuery.inArray("6", arr) !== -1) { console.log('6'); }
    else if(jQuery.inArray("9", arr) !== -1) { console.log('9'); }
    else if(jQuery.inArray("7", arr) !== -1) { console.log('7'); }
    else if(jQuery.inArray("5", arr) !== -1) { console.log('5'); }
    else if(jQuery.inArray("4", arr) !== -1) { console.log('4'); }
    else if(jQuery.inArray("1", arr) !== -1) { console.log('1'); }
    else { console.log('not found'); }
}

示例

步骤1是相当容易使用javascript的joinsplit方法分别:

var arr = carArray .join().split(',');

对于步骤2,可以使用几种方法,最常见的方法是使用对象并使用元素本身作为属性。因为您只需要在存在重复出现的值时获取出现次数最多的值,所以它可以在同一个循环中使用:

var counts = {}; //object to hold count for each occurence    
var max = 0, maxOccurring;
arr.forEach(function(el){     
    var cnt = (counts[el] || 0); //previous count
    counts[el] = ++cnt;
    if(cnt > max && cnt > 1){ //only register if more than once (cnt>1)
        max=cnt;
        maxOccurring = el;
    }
});

之后,变量maxOccurring将包含重复出现的值(如果有的话),max将包含它出现的次数

对于第4步,最简单的方法是循环遍历比较数组并获取在输入数组中出现的元素:

var cmpArr = ['6','7','4','1','2','8','9','5'];
//find the first occurrence inside the cmpArr
res = function(){ for(var i= 0 ; i < cmpArr.length; i++){ if(arr.indexOf(cmpArr[i]) !== -1)return cmpArr[i];}}();  
上面的

使用了一个就地函数,该函数被立即调用以能够使用return。你也可以使用一个循环并在找到时赋值res,然后跳出循环。

最后一次更新,将上述内容转换为单个函数:http://jsfiddle.net/v9hhsdny/5/

首先,由于jQuery选择器是相同的,下面的代码会产生四个匹配的答案。

var questionAnswer1 = $(this).find('input[name=questionText]').val();
var questionAnswer2 = $(this).find('input[name=questionText]').val();
var questionAnswer3 = $(this).find('input[name=questionText]').val();
var questionAnswer4 = $(this).find('input[name=questionText]').val();
var carArray = [questionAnswer1, questionAnswer2, questionAnswer3, questionAnswer4];

您可以使用jQuery的eq(index)方法来选择合适的元素。然而,有4个相同名称的输入是一个不好的做法。

假设carArray有4个不同的值,它们都由逗号分隔的数字组成。然后,您可以执行以下操作:

var newArr = [];
carArray.forEach(function(e) {
    e.split(",").forEach(function(n) {
        newArr.push(n);
    });
});

那么我们要找到出现次数最多的数。JavaScript没有任何函数,所以我们必须找到一个算法。我在这个stackoverflow页面上找到了以下算法

var count = function(ary, classifier) {
    return ary.reduce(function(counter, item) {
        var p = (classifier || String)(item);
        counter[p] = counter.hasOwnProperty(p) ? counter[p] + 1 : 1;
        return counter;
    }, {})
}
var occurances = count(newArr);

我不清楚你在第3步和第4步要做什么,所以现在不能回答这些问题。

var ary = ["1,8", "4,6,8", "8,9", "6,9"];
var splitted = ary.reduce(function(acc, item) {
        return acc.concat(item.split(','));
    }, []);
var occurences = splitted.reduce(function(acc, item) {
        if (!acc.hasOwnProperty(item)) acc[item] = 0;
        acc[item] += 1;
        return acc;
    },{}),
    biggest = Object.keys(occurences).reduce(function (acc, key) {
        if (occurences[key] > acc.occurences) {
            acc.name = key;
            acc.occurences = occurences[key];
        }
        return acc;
    },{'name':'none','occurences':0}).name;
var vals=["1,8", "4,6,8", "8,9", "6,9"];
// 1)  turn into number array
var arrNew=[];
for(var i=0; i<vals.length; i++)   
{ 
    arrLine=vals[i].split(",");
    for (var j=0;j<arrLine.length;j++) { arrNew.push (parseInt(arrLine[j])) }
}
//result: 
alert(arrNew.join(";");
// 2) find most common
var found=[];
for(var i=0; i<arrNew.length; i++) {
    // make an array of the number of occurrances of each value
    if (found["num"+newArray[i]]) {
        found["num"+newArray[i]] ++ ;
    } else {
        found["num"+newArray[i]]=1;
    }
}
var mostCommon={count:0,val:"ROGUE"};
for (x in found) {
    if (found[x] > mostCommon.count) {
        mostCommon.count=found[x].count;
        mostCommon.val=x;
    }
}
// result : 
alert(mostCommon.val);
//3) not quite sure what you meant there
// 4) unique values:
// at this point the 'found' list contains unique vals
var arrUnique=[];
for (x in found) {
    arrUnique.push[x];
}
// result :
alert(arrUnique.join(";"))

//sort:
arrUnique.sort(function(a, b){return a-b}); 

(这在大多数浏览器中不起作用)但是在侧面说明,当ES6得到广泛支持时,您的解决方案可能看起来像这样:

var arr1 = ["1,8", "4,6,8", "8,9", "6,9"];
var arr2 = arr1.join().split(',');
var s = Array.from(new Set(arr2)); //Array populated by unique values, ["1", "8", "4", "6", "9"]

我想你可能想看到未来的一瞥!

1.

var orgArray = ['1,8', '4,6,8', '8,9', '6,9'];
var newArray = [];
for (var i in orgArray) {
  var tmpArray = orgArray[i].split(',');
  for (var j in tmpArray) {
    newArray.push(Number(tmpArray[j]));
  }
}

2。

var counts = {};
var most = null;
for (var i in newArray) {
  var num = newArray[i];
  if (typeof counts[num] === 'undefined') {
    counts[num] = 1;
  } else {
    ++(counts[num]);
  }
  if (most == null || counts[num] > counts[most]) {
    most = num;
  } else if (most != null && counts[num] === counts[most]) {
    most = null;
  }
}

我不明白问题3和4("唯一顺序"是什么意思),所以我不能回答这些问题。