搜索并计算特定命令在数组中出现了多少次

时间:2019-01-10 07:35:09

标签: javascript arrays multidimensional-array

我没有找到任何东西。这是我的测试用例:

            InfoDBContext InfoContext = new InfoDBContext();

            object o = InfoContext.Visas.ToList().Where(visa => visa.VisaName == "Visa 1").FirstOrDefault().Employees;
            return View(o);

这是我到目前为止的代码:

  public ActionResult VEmployees() 
        {
            InfoDBContext InfoContext = new InfoDBContext();
            //int EmployeeID = InfoContext.Infoes.ToList().Where(emp => emp.ID == 1).FirstOrDefault().ID;
            object o = InfoContext.Visas.Include(e => e.Employees).Where(v => v.VisaName=="Hunain").FirstOrDefault().Employees;
            return View(o);
        }

那是当我尝试搜索偶数时,如果要搜索偶数,则必须返回行号和什么数字,但另一方面,如果不搜索数字且数组的长度不相同,则需要返回什么列和出现多少次。 这种情况无需使用正则表达式,映射,过滤器,索引等内置函数,只需使用循环和诸如推,弹出,移位等数组操作即可

谢谢您的帮助,我只是一个尝试学习代码的菜鸟:)

2 个答案:

答案 0 :(得分:1)

  

这种情况不需要内置功能

通常,当您要将数组变成一个值时,可以使用Array.prototype.reduce

const specificSearch = (array, comparer) =>
  array.reduce((highest, items) => {
    //reduce to highest number
    const current = items.reduce(
      //reduce to number
      //if comparer returns true for item add 1 to sum
      (sum, item) => (comparer(item) ? sum + 1 : sum),
      0,//start with sum of 0
    );
    //if current result is higher than highest so far
    //  return current, else return highest
    return current > highest ? current : highest;
  }, 0/** start with highest value of 0 */);

console.log(
  "max times even in item array",
  specificSearch(
    [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
    (x) => x % 2 === 0,
  ),
);

console.log(
  "max times value of 'x' in item array",
  specificSearch(
    [
      ['o', 'o', 'o', 'x'],
      ['x', 'x', 'o'],
      ['o', 'x'],
      ['x', 'x', 'x', 'x', 'x', 'x', 'x'],
    ],
    (x) => x === 'x',
  ),
);

如果您看到代码片段,那么您会发现可以将数组转换为带有内部约简的数字,而外部约简则选择最高的数字。

内部reduce使用specificSearch的调用者传递的比较器函数来指示何时需要增加总和,现在,调用者可以确定如何使用specificSearch

答案 1 :(得分:1)

您可以移交一个用于检查特定值的函数,然后为检查返回一个布尔值。

  • even

    x => !(x % 2)`
    
  • 进行身份检查

    x => x === 'x'
    

然后,您可以收集行和列数组中的所有计数,以后再获取最大值,然后从rows / cols数组中返回具有最大值的索引。

结果是一个对象的行/列的最大计数和发生最大计数的索引。

顺便说一句,这个答案使用索引,因为它们在Javascript中起作用,从零开始。如果您需要以1开头,则只需为每个索引添加1。

function specificSearch(array, checkFn) {

    function getIndices(array, value) {
        var i, indices = [];
        for (i = 0; i < array.length; i++) {
            if (array[i] === value) indices.push(i);
        }
        return indices;
    }

    var i, j,
        rows = [],
        cols = [],
        max;

    for (i = 0; i < array.length; i++) {
        for (j = 0; j < array[i].length; j++) {
            if (checkFn(array[i][j])) {
                rows[i] = (rows[i] || 0) + 1;
                cols[j] = (cols[j] || 0) + 1;
            }
        }
    }
    max = Math.max(...cols, ...rows);
    return { max, rows: getIndices(rows, max), cols: getIndices(cols, max) };
}

console.log(specificSearch([[1, 2, 3], [4, 5, 6], [7, 8, 9]], x => !(x % 2)));
console.log(specificSearch([['o', 'o', 'o', 'x'], ['x', 'x', 'o'], ['o', 'x'], ['x', 'x', 'x', 'x', 'x', 'x', 'x']], x => x === 'x'));
.as-console-wrapper { max-height: 100% !important; top: 0; }