Javascript количество итераций в другом массиве - PullRequest
0 голосов
/ 07 июня 2019

Я чувствую, что здесь есть много вопросов, похожих на это, но, поскольку я все еще застрял, думаю, я задам.Это проблема кодекования линтера, и я не могу собрать количество случаев, когда элементы одного массива были найдены в другом.

Даже с решениями, предоставленными другими в Git, я не могу ответить «своим».Я видел много подобных решений здесь, в SO, но все еще не двигался дальше.

массив 1

[ a, b, c, d, e, a, b, c, d, e, a,...]

массив 2

[a, b]

код

const newConstant = (array1.forEach(foo) => {
     array2.filter (bar) => {
         if (foo[i] === bar[i]) {
             newConstant++;
         }
     }
});

Я, вероятно, подвергаю сомнению решения, которые я видел, и беру худшее из обоих миров.Но поскольку я смотрел на это в течение почти 2 часов за 3 сеанса, я просто коснулся глазами.Почему я не могу собрать количество раз, когда a и b появляются в массиве 1?

ошибка:

SyntaxError: Неожиданный токен '

Ответы [ 5 ]

1 голос
/ 07 июня 2019

Поскольку вы уже получили некоторые ответы, я подумал, что предоставлю альтернативу. Это может быть немного медленнее, чем некоторые другие ответы, но мне нравится, как оно читается.

var findNeedles = function (needle, haystack) {
  return haystack
    // we only need to check as far as there is room for the needle
    .slice(0, haystack.length - needle.length + 1)
    // get each subsection that may match the needle (same length)
    .map((c, i, a) => haystack.slice(i, i + needle.length))
    // filter out sections that match the needle
    .filter(c => c.every((e, i)=> e === needle[i] ));
}

var haystack = [ "a", "b", "c", "d", "e", "a", "b", "c", "d", "e", "a"];
var needle = ["a", "b"];
console.log("Found matches: ", findNeedles(needle, haystack).length);

Вы также можете разбить вещи на части, чтобы сделать их более читабельными, если вы не уверены. Например

var findNeedles = function (needle, haystack) {
  var getPotentialNeedle = (c, i, a) => haystack.slice(i, i + needle.length);
  
  var needlePartMatches = (part, index) => part === needle[index];
  
  var isNeedle = (potentialNeedle) => potentialNeedle.every(needlePartMatches);
  
  return haystack
    // we only need to check as far as there is room for the needle
    .slice(0, haystack.length - needle.length + 1)
    .map(getPotentialNeedle)
    .filter(isNeedle);
}

var haystack = [ "a", "b", "c", "d", "e", "a", "b", "c", "d", "e", "a"];
var needle = ["a", "b"];
console.log("Found matches: ", findNeedles(needle, haystack).length);
1 голос
/ 07 июня 2019

У вас есть основные синтаксические ошибки, Вот исправление синтаксиса:

let newConstant = 0;
array1.forEach( foo => {
    array2.filter( bar => {
        if( foo === bar ){
            newConstant++;
        }
    } )

} );

Вы не можете const, потому что вы увеличиваете значение переменной (переназначая значение), И этоКлючевое слово const означает, что вы хотите присвоить ему начальное значение и никогда не изменять его.Поэтому замените его на let, что позволяет изменить значение переменной.

2 метода forEach & filter принимают в качестве аргумента функцию, В этом коде вы используете функцию стрелкиfoo => { ... }, но с неверным синтаксисом.

Таким образом, вам нужно передать эту функцию в качестве аргумента forEach & filter, поместив целое в скобки forEach( HERE! ) ... Пример: array1.forEach( foo => { ... } )

Последнее, что я вижу, вы пытались увеличить newConstant при объявлении и присвоении этой переменной, что невозможно или, по крайней мере, не будет работать.

1 голос
/ 07 июня 2019

В вашем коде есть несколько проблем ...

Я полагаю, что вы должны прочитать об объявлении переменных и функциях стрелок, потому что, как указано в сообщении об ошибке, ваш синтаксис неправильный.

Вот ваш кусок, модифицированный так, чтобы иметь желаемую функцию:

let newConstant = 0;
array1.forEach((foo) => {
    array2.filter((bar) => {
        if (foo === bar) {
            newConstant++;
        }
    })
});
console.log(newConstant);

Однако я бы подошел к нему по-другому, например:

let count=0;
array1.map((elm1) => {
    if(array2.indexOf(elm1)!==-1) {
        count+=1;
    }
});
console.log(count);
0 голосов
/ 07 июня 2019

Простое решение,

var array1  = [ 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a'];

var array2 =  ['a', 'b', 'a'];

var result = {};

array2.forEach((elem) => {
    let count = array1.filter(element => element === elem);
    result[Symbol('a')] = count.length; // Here we use symbols to catch hold of repeated elements
});

console.log(result);
0 голосов
/ 07 июня 2019

Простое решение;)

let arr1 =  [ 'a', 'b', 'c', 'd', 'a', 'b', 'b'];
let arr2 = ['a', 'b'];
let obj= {};
arr1.forEach(x => {
        arr2.forEach(y => {
            if(y === x){
                if(obj[x]){
                obj[x] = obj[x] + 1;
            } else {
                obj[x] = 1;
            }
        }
    });
});

console.log(obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...