You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AngularJS将嵌套JSON对象渲染为Bootstrap同行列布局?

解决AngularJS中Bootstrap栅格横向排列设备的问题

你当前代码的问题在于:每个product对应的外层<div>是块级元素,它会把该产品下的设备列包裹起来,打断Bootstrap的栅格布局逻辑,导致设备按产品分组换行。下面提供几种可行的解决方案:


方案一:控制器预处理扁平化数组(最简单直接)

在AngularJS控制器里,先把所有产品的设备合并成一个一维数组:

// 假设你的数据源存储在$scope.obj中
$scope.allDevices = [];
angular.forEach($scope.obj.products, function(product) {
    $scope.allDevices = $scope.allDevices.concat(product.devices);
});

然后在视图中直接遍历这个扁平化后的数组:

<div class="row">
    <div class="col-3" ng-repeat="device in allDevices">
        {{device.label}}
    </div>
</div>

方案二:去掉多余外层容器,用无DOM渲染的嵌套循环

无需修改控制器,通过ng-repeat-start和ng-repeat-end实现无额外容器的嵌套循环,同时用ng-if="false"让外层循环生成的空div不渲染:

<div class="row">
    <div ng-repeat-start="product in obj.products" ng-if="false"></div>
        <div class="col-3" ng-repeat="device in product.devices">
            {{device.label}}
        </div>
    <div ng-repeat-end ng-if="false"></div>
</div>

最终生成的DOM结构会和你期望的完全一致,所有col-3直接作为row的子元素。


方案三:自定义过滤器扁平化数组

如果不想修改控制器逻辑,可以通过自定义过滤器处理数组:
先在模块中注册两个过滤器:

var app = angular.module('yourApp', []);

// 提取数组对象的指定属性
app.filter('map', function() {
    return function(arr, prop) {
        return arr.map(function(item) {
            return item[prop];
        });
    };
});

// 扁平化二维数组
app.filter('flatten', function() {
    return function(arr) {
        return [].concat.apply([], arr);
    };
});

然后在视图中组合使用过滤器:

<div class="row">
    <div class="col-3" ng-repeat="device in obj.products | map:'devices' | flatten">
        {{device.label}}
    </div>
</div>

以上三种方法都能让所有设备的col-3元素直接作为row的子元素,符合Bootstrap栅格的布局规则,实现横向并排显示。

内容的提问来源于stack exchange,提问作者Navorski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:05:24