Я хотел бы, чтобы эта функция работала так, как задумано в JavaScript:

function isLastElem(array, elem) {
    if (elem === array[array.length-1]) {
        return true;
    }
    else {
        return false;
    }
}

Предполагается, что функция должна быть в состоянии идентифицировать последний элемент любого массива. Например:

let arr = [0, 1, 2];
console.log(isLastElem(arr, 2)); // I would expect false to be returned
console.log(isLastElem(arr, arr[2])); // I would expect true to be returned

Однако, поскольку числа являются примитивными значениями, они передаются функции по своим значениям, и поэтому оба вызова функции возвращают true. Любой способ решить это и передать номера по ссылке?

Важной идеей здесь будет сделать его пригодным для каждого цикла. Например:

let arr = [0, 1, 0];
arr.forEach((elem) => {
    if (isLastElem(arr, elem)) {
        console.log("Found the last element!");
    }
});

В первом 0 функция должна возвращать false, так как это не последний элемент массива. Затем при втором 0 он должен вернуть true и записать сообщение.

0
HunBonus 20 Дек 2019 в 18:45

3 ответа

Вы можете сделать это, поместив свой номер в массив или объект, вот так:

let arr = [[0], [1], [2]];
console.log(isLastElem(arr, [2])); // returns false
console.log(isLastElem(arr, arr[2])); // returns true
1
Waruyama 20 Дек 2019 в 18:53

Несмотря на то, что я изо всех сил пытаюсь представить, почему кому-нибудь понадобится это сделать, я думаю, что мы могли бы сделать эту работу с Symbol:

Каждое значение символа, возвращаемое из Symbol (), является уникальным. Значение символа может использоваться в качестве идентификатора для свойств объекта; это единственная цель типа данных.

Таким образом, это означает, что мы можем использовать Symbol для отметки каждого элемента массива. Как видите, массив 1 можно преобразовать в массив символов 1, которые все уникальны:

const xs = [1, 1];

xs[0] === xs[1];
//=> true

const ys = [Symbol(1), Symbol(1)];

ys[0] === ys[1];
//=> false

ys[0] === Symbol(1);
//=> false

ys[1] === ys[1];
//=> true

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

console.log(

  [1, 1, 1]
    // convert to list of symbols of 1
    .map(Symbol)
    // check if current element is equal to the last element
    .map((x, _, xs) => x === xs[xs.length - 1])
    
);
//=> [false, false, true]

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

Мы можем поместить каждый элемент в объект, скрытый за «секретным уникальным» ключом. У каждого объекта есть метод для извлечения его значения и сравнения с другими подобными объектами:

const obj = (k, v) => (
  { [k]: v
  , get: () => v
  , equals: o => o[k] === v
  });

const stamp = (arr, secret = Date.now()) =>
  arr.map((x, i) => obj(`${secret}@@${i}`, x));
  
const arr = stamp([1, 1, 1]);

arr.forEach((x, _, xs) => {
  console.log(x.get(), x.equals(xs[xs.length - 1]));
});
1
customcommander 21 Дек 2019 в 04:54

Вы можете попробовать этот код


let arr = [0, 1, 2];
console.log(isPrimitive(arr[index+1]));

function isPrimitive(val) {
  return isString(val) || isBoolean(val) || (isNumber(val) && !isNaN(val));
}
-1
majid 20 Дек 2019 в 19:05
1
При чем здесь вопрос?
 – 
Pointy
20 Дек 2019 в 18:54