2015-09-25 5 views
1

У меня есть два массива. Вот первый:Доступ к вложенному многомерному массиву в AngularJS

$scope.selection = { 
    "carrots", 
    "celery", 
    "corn", 
    "apples", 
    "bananas" 
}; 

Вот второй:

$scope.shipment = [{ 
    "id": "0", 
    "name": "vegetables", 
    "manifest": [{"carrots", "celery", "corn"}] 
    }, { 
    "id": "1", 
    "name": "produce", 
    "manifest": [{"apples", "carrots", "bananas"}] 
}]; 

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

if ($.inArray($scope.shipment.manifest[0], $scope.selection) < 0) { console.log($scope.shipment.id) }; 

// for "carrots" 
=> "0" 

Но так как «морковь» находится в двух позициях индекса в массиве отгрузки, выше будет возвращать только первый идентификатор отгрузки.

Как я могу получить обе партии?

+0

Вы можете использовать функцию .filter в JavaScript. Это вернет все элементы, соответствующие вашему выражению. – thsorens

ответ

1

Прежде всего, ваш объект selection недействителен.

Объекты являются парами ключ-значение, и у вас есть только строки. Вероятно, это должен быть массив.

Во-вторых, то же самое происходит с объектами внутри объекта manifest. Они также должны быть массивами.

При установлении кода, вы можете использовать Array.prototype.filter, чтобы достичь того, чего вы хотите:

var result = $scope.shipment.filter(function(obj) { 
    return obj.manifest.indexOf(item) >= 0; 
}); 

Посмотрите на отрезала я создал ниже:

var $scope = {}; 
 

 
$scope.selection = [ 
 
    "carrots", 
 
    "celery", 
 
    "corn", 
 
    "apples", 
 
    "bananas" 
 
]; 
 

 
$scope.shipment = [{ 
 
    "id": "0", 
 
    "name": "vegetables", 
 
    "manifest": ["carrots", "celery", "corn"] 
 
    }, { 
 
    "id": "1", 
 
    "name": "produce", 
 
    "manifest": ["apples", "carrots", "bananas"] 
 
}]; 
 

 
var html = ''; 
 

 
$scope.selection.forEach(function(item, i) { 
 
    var result = $scope.shipment.filter(function(obj) { 
 
    return obj.manifest.indexOf(item) >= 0; 
 
    }); 
 
    
 
    html += 
 
    '<div>' + 
 
     '<span>Item: ' + item + '</span>' + 
 
    '</div>' + 
 
    '<div>' + 
 
     '<pre>' + JSON.stringify(result, null, 2) + '</pre>' + 
 
    '</div>'; 
 
}); 
 

 
document.body.innerHTML = html;

+0

Спасибо. Это помогло мне понять, чего я пропустил. –

0

$scope.shipment это массив, который не имеет свойства manifest, но элементы этого массива a повторно объекты, которые имеют свойство, что

Попробуйте

$.inArray($scope.shipment[0].manifest[0], $scope.selection) 

Как уже упоминалось есть более простые способы, но я хотел бы отметить проблему

+0

Это продолжало возвращать меня к той же проблеме, что и раньше. Это только призыв первого манифеста. –

Смежные вопросы