2015-05-26 3 views
1

Я новичок в json. My json arrayПоиск в json array

[{"seat_number":"834"},{"seat_number":"8F3"},{"seat_number":"891"}, 
{"seat_number":"814"},{"seat_number":"4081"},{"seat_number":"8F1"}, 
{"seat_number":"8F9"},{"seat_number":"4039"},{"seat_number":"0"}, 
{"seat_number":"509"},{"seat_number":"662"},{"seat_number":"561"}, 
{"seat_number":"791"},{"seat_number":"849"}] 

Я хочу найти номер места уже существует в массиве.

if(($scope.employeeSeat.seat_array.indexOf($scope.employeeData.new_seat_number))>-1) 
{ 
alert('Seat number is already assigned.Please Check'); 
} 

Что не так?

+1

Ваш 'indexOf' ищет' 834', когда необходимо искать '{seat_number: 834}' (последний не так просто учитывая, как проверки равенства не работают). – Thilo

+0

какие рамки вы используете ?? –

+0

Laravel freamwork – Piyush

ответ

1

Вы можете сделать это трудный путь, если вы хотите

var data = [ 
    {"seat_number":"834"},{"seat_number":"8F3"}, 
    {"seat_number":"891"},{"seat_number":"814"}, 
    {"seat_number":"4081"},{"seat_number":"8F1"}, 
    {"seat_number":"8F9"},{"seat_number":"4039"}, 
    {"seat_number":"0"},{"seat_number":"509"}, 
    {"seat_number":"662"},{"seat_number":"561"}, 
    {"seat_number":"791"},{"seat_number":"849"} 
]; 

function matchingSeat(x) { 
    return data.some(function(elem) { 
    return elem.seat_number === x; 
    }); 
} 

console.log("831", matchingSeat("834")); // 834 true 
console.log("8F3", matchingSeat("8F3")); // 8F3 true 
console.log("999", matchingSeat("999")); // 999 false 

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

Не урод: раствор ES5 ниже

// ES6 
// reusable lib 
let prop = y => x => x[y]; 

let comp = f => g => x => f(g(x)); 

let eq = y => x => x === y; 

let some = f => xs => xs.some(f); 

Теперь написать несколько помощников, чтобы решить вашу задачу

let eqSeat = x => comp(eq(x))(prop("seat_number")); 
let hasSeat = comp(some)(eqSeat); 

Проверьте это

console.log("831", hasSeat("834")(data)); // 831 true 
console.log("8F3", hasSeat("8F3")(data)); // 8F3 true 
console.log("999", hasSeat("999")(data)); // 999 false 

Вот тот же код в ES5

// ES5 
// reusable lib 
var prop = function prop(y) { 
    return function (x) { 
    return x[y]; 
    }; 
}; 

var comp = function comp(f) { 
    return function (g) { 
    return function (x) { 
     return f(g(x)); 
    }; 
    }; 
}; 

var eq = function eq(y) { 
    return function (x) { 
    return x === y; 
    }; 
}; 

var some = function some(f) { 
    return function (xs) { 
    return xs.some(f); 
    }; 
}; 

Ваши помощники

var eqSeat = function eqSeat(x) { 
    return comp(eq(x))(prop("seat_number")); 
}; 

var hasSeat = comp(some)(eqSeat); 

Попробуйте

console.log("831", hasSeat("834")(data)); // 831 true 
console.log("8F3", hasSeat("8F3")(data)); // 8F3 true 
console.log("999", hasSeat("999")(data)); // 999 false 
0
for(var i = 0; i < myjson.length; i++) 
{ 
    if(myjson[i].seat_number == expectednumber) 
    { 
    alert('Seat number is already assigned.Please Check') 
    } 
} 
0

Элемент в массиве - это объект, поэтому вы не можете использовать indexOf для поиска seat_number.

вы можете попробовать:

for(var i=0; i<$scope.employeeSeat.seat_array.length; ++i){ 
    if($scope.employeeData.new_seat_number == $scope.employeeSeat.seat_array[i].seat_number){ 
     alert('Seat number is already assigned.Please Check'); 
    } 
} 
0

Попробуйте это. Используйте filter(). Если arr пуст, тогда он должен показать alert.

var arr=$scope.employeeSeat.seat_array.filter(function(item){ 
    return $scope.employeeData.new_seat_number == item.seat_number; 
}) 
if(!arr.length){ 
alert('Seat number is already assigned.Please Check'); 
} 

Вы также можете использовать some().

var bool=$scope.employeeSeat.seat_array.some(function(item){ 
    return $scope.employeeData.new_seat_number == item.seat_number; 
}) 
if(bool){ 
alert('Seat number is already assigned.Please Check'); 
} 
1

Обратите внимание, что ({a:10}) !== ({a:10}), поэтому ваш indexOf не будет работать. См. Вопрос this.

Зная, что есть несколько способов сделать это (предполагающие typeof $scope.employeeData.new_seat_number === 'string'):

1) Используйте for -loop:

for (var i = 0; i < $scope.employeeSeat.seat_array.length; i++) { 
    if ($scope.employeeSeat.seat_array[i].seat_number === $scope.employeeData.new_seat_number) { 
     alert('Seat number is already assigned.Please Check'); 
    } 
} 

2) Используйте .some:

if ($scope.employeeSeat.seat_array.some(function(seat) { return seat.seat_number === $scope.employeeData.new_seat_number; })) { 
    alert('Seat number is already assigned.Please Check'); 
} 

Примечание: .some - лучший ответ, кроме старых добрых for -loop в моем opinio п. Остальные являются исследованиями ArrayAPI.

3) Использование .findIndex:

if ($scope.employeeSeat.seat_array.findIndex(function(seat) { return seat.seat_number === $scope.employeeData.new_seat_number; }) !== -1) { 
    alert('Seat number is already assigned.Please Check'); 
} 

4) Используйте .find:

if ($scope.employeeSeat.seat_array.find(function(seat) { return seat.seat_number === $scope.employeeData.new_seat_number; })) { 
    alert('Seat number is already assigned.Please Check'); 
} 

Примечание: .find и .findIndex являются экспериментальные технологии. Проверьте их compatibilitytables, чтобы узнать, доступен ли .find для вашего браузера. Если нет, используйте их polyfills.

5) Использование .map:

if ($scope.employeeSeat.seat_array.map(function(seat) { return seat.seat_number; }).indexOf($scope.employeeData.new_seat_number)) !== -1) { 
    alert('Seat number is already assigned.Please Check'); 
} 

Примечание: Использование .map будет гораздо медленнее как .map перебирает массив работает функция, которая будет использоваться для создания совершенно нового массива.

0

Вы можете использовать прототип поиска массива. Вы можете найти подробную информацию об этом методе here.

Пример:

var items = [{"seat_number":"834"},{"seat_number":"8F3"},{"seat_number":"891"},{"seat_number":"814"},{"seat_number":"4081"},{"seat_number":"8F1"},{"seat_number":"8F9"},{"seat_number":"4039"},{"seat_number":"0"},{"seat_number":"509"},{"seat_number":"662"},{"seat_number":"561"},{"seat_number":"791"},{"seat_number":"849"}]; 

var newSeatNumber = $scope.employeeData.new_seat_number; 
var result = items.find(function(item) {return item.seat_number == newSeatNumber ;}) 


console.log(result); // Object { seat_number="791"} if found, else undefined 
if(result) 
{ 
    //Do your stuff. Item exits in array 
} 
+1

Примечание: Это технология __experimental__, являющаяся частью предложения ECMAScript 6 (Harmony). Проверьте [совместимость таблицы] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Browser_compatibility), чтобы увидеть, будет ли '.find' работать в вашем браузере. – usandfriends

+0

@usandfriends, я согласен. Вы можете использовать Polyfill, но только если вы используете этот тип сравнения очень часто. Голосуйте за вас. –

+0

yup. Вот ссылка на [polyfill] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Polyfill). – usandfriends

-1

Зачем вам нужен такой JSON структуры?

I've changed the structure a little. 
{ 
    "seat_numbers" :["894", "900", "814", "591", "789", ..] 
} 

Загрузите JSON с помощью JavaScript/JQuery

var yourSearchingSeat = "900"; 
$.getJSON("ajax/test.json", function(data) { 
    var seat_numbers = data.seat_numbers 
    for (i=0; i<seat_numbers.length;i++) { 
     if (seat_numbers[i] == yourSearchingSeat) { 
      console.log("Seat number"+yourSearchingSeat+" already exists"); 
     } 
    } 
});