2015-03-04 2 views
0
function addNumifnotThere(numer){ 
    var numCent = []; 

    numCent.forEach(function(){ 
     if(numer in numCent) 
     console.log("you logged that"); 
     else 
     numCent.push(numer); 


}); 
return numCent; 
} 

Это мой текущий код, что его пытаются сделать, это прочитать массив, и если есть уже элемент выходит из цикла и говорит: «Вы уже зарегистрированы что ", очевидно, если он не может найти аналогичный элемент, то он подталкивает его к массиву.Как добавить элементы в динамический массив и исключающие exsisting элементы

Я хочу, чтобы это работало динамически, поэтому мы не можем заранее знать размер массива, поэтому первый элемент, переданный как аргумент, должен быть помещен в массив, (addNum (1) должен иметь распечатку массива [1] , вызов addNum (1) снова должен напечатать «вы уже зарегистрировали это»)

Однако есть две проблемы с этим 1) Попытка нажать на новый массив без каких-либо записей означает, что все не определено и, следовательно, пытается пройти массив просто заставляет программу печатать [].

2) Добавление некоторых случайных элементов в массив, чтобы заставить его работать, в этом случае numCent = [1,2,3] имеет другие проблемы, в основном, что добавление числа выше 3 приводит к тому, что код печатает некорректную информацию. В этом случае addNum (5) должен печатать [1,2,3,5], но вместо этого печатает [1,2,3,5,5,5]

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

EDIT: Благодаря многочисленным выдающимся ответам здесь я теперь склоняюсь к методу indexOf, спасибо вам, ребята, так много.

+1

Я смущен; вы хотите сохранить содержимое массива, но вы создаете новый массив в первой строке функции? –

+0

Почему вы не используете библиотеку lodash.js и используете ее «включает» 'https: // lodash.com/docs # includes' –

ответ

0

Для каждого несоответствия вы нажимаете номер. Используйте что-то вроде этого

var numCent = []; 
function addNumifnotThere(numer) 
{ 
    var index = numCent.indexOf(number); 
    if(index >=0) 
    { 
     console.log("you logged that"); 
    } 
    else 
    { 
     numCent.push(number); 
    } 

    return numCent; 
} 
0

Использование Array.prototype.indexOf

var numCent = []; 
 
function addNum(numer){ 
 

 
     if (numCent.indexOf(numer) > -1) 
 
     { 
 
      console.log("Number already in array");  
 
     } 
 
     else 
 
     { 
 
      numCent.push(numer); 
 
     } 
 
} 
 

 
//DEMO CODE, not part of solution 
 
document.querySelector("button").addEventListener("click", function(){ 
 
    if (document.querySelector("input").value.length > 0) 
 
    { 
 
     addNum(document.querySelector("input").value); 
 
     document.querySelector("div").innerHTML = numCent.join(", "); 
 
    } 
 
}, false);
Output 
 
<div id="output"></div> 
 

 
<input /> 
 
<button>Add number</button>

indexOf испытаний, если элемент находится внутри массива и возвращает его индекс. Если не найден, он вернется -1. Вы можете проверить это. Вы можете попробовать это для себя в этом фрагменте. Он позволит только добавить число (или любую строку в этом примере) один раз.

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

+0

это прекрасно работает. – Ziplox

+0

@ Ziplox, если это сработало, выберите в качестве ответа. – Mouser

0

Если вы хотите, чтобы массив хранился в экземпляре, вы можете сделать это вот так.

function AddIf(arr){ 
    if(arr || !this.arr) { 
    this.arr = arr || []; 
    } 

    return function(number) { 
    if(this.arr.indexOf(number) >= 0) { 
     console.log("Already Present!"); 
    } else { 
     this.arr.push(number); 
    } 

    return this.arr; 
    }.bind(this); 
} 

// Usage would be like this: 
// var addIf = new AddIf([1, 2, 3]); 
// addIf(10); // returns [1, 2, 3, 10] 
// addIf(10); // logs "Already Present!", doesn't add 10 to array 

В основном это возвращает функцию, с this, связанный с функцией вызывается. Если вы передадите исходный массив, он будет использовать этот массив для сравнения с добавлением его в массив.

Вы можете поймать функцию возврата и назвать ее так, как вам хотелось бы. Если вы не вызываете new при вызове, он будет использовать один и тот же экземпляр массива (и иметь напуганный способ вызова, AddIf()(10)).

Я использовал fn.bind(), чтобы гарантировать, что функция вызывается в правильном контексте каждый раз, если вам интересно, почему я так назвал ее.

0

Сделайте это чисто, я бы рассмотрел прототипирование глобального объекта Array и добавление метода для push-значений, но только если они уникальны для массива. Что-то вроде этого:

Array.prototype.pushUnique = function (item) { 
    if (this.indexOf(item) != -1) { 
     console.log("Item with value of " + item + " already exists in the array." 
    } 
    else { 
     this.push(item); 
    } 
} 

Если вы не устраивает prototypeing глобальные типы как Array, вы можете построить то же самое в процедурном схеме:

function arrayPushUnique (arr, item) { 
    if (arr.indexOf(item) != -1) { 
     console.log("Item with value of " + item + " already exists in the array." 
    } 
    else { 
     arr.push(item); 
    } 
} 

Затем, чтобы использовать его, просто создать новый пустой массив и начать толкать к нему вещи.

var numCent = []; 
// The Array.prototype method 
numCent.pushUnique(number); 
// The procedural method 
arrayPushUnique(numCent, number); 
Смежные вопросы