【问题标题】:How to push json into array?如何将json推入数组?
【发布时间】:2018-05-24 11:02:20
【问题描述】:

我有一个数组

$scope.headArray=[
  'Online & Open Alarms',
  'Sites Overview',
  'Active Alarms',
  'Hidden Alarms'
];

我有一个对象:

$scope.dashboardstatus = {
  hideDashboard1:true,  closeDashboard1:false,
  hideDashboard2:true,  closeDashboard2:true,
  hideDashboard3:false, closeDashboard3:false,
  hideDashboard4:false, closeDashboard4:false
}

我想创建这个表:

$scope.dashArray = [
 {Online & Open Alarms:{hideDashboard1:true,closeDashboard1:false}} ,
 {Sites Overview:      {hideDashboard2:true,closeDashboard2:true}},
  Actives Alarms:      {hideDashboard3:false,hideDashboard3:false},
 {Hidden Alarms:       {hideDashboard4:false,closeDashboard4}}
]

我试过这个:

for (var i=0; i< $scope.headingArray.length; i++){         
    $scope.dashArray.push({$scope.headingArray[i],
   {$scope.dashboardstatus['closeDashboard'(i+1)],$scope.dashboardstatus['hideDashboard'+(i+1)]}}
);                                                                                                                                  
 }  

但不行!

如何将数据推入dashArray?

【问题讨论】:

  • 这是无效的:[{Online &amp; Open Alarms:{hideDashboard1...
  • 您的$scope.dashArray 无效。
  • 确实dashArray 如图所示是无效的,但我想要的目标似乎很清楚,这只是一个符号问题......(我希望。)跨度>
  • FWIW,很多编程都注重细节。例如,不要在一个地方使用$scope.headArray,而在另一个地方使用$scope.headingArray,确保不要遗漏运算符('closeDashboard'(i+1))等。

标签: javascript arrays angularjs


【解决方案1】:

您可以执行以下操作以获得最终结果:

let headArray=['Online & Open Alarms','Sites Overview','Active Alarms','Hidden Alarms'];
let dashboardstatus = {hideDashboard1:true,closeDashboard1:false,hideDashboard2:true,closeDashboard2:true,hideDashboard3:false,closeDashboard3:false,hideDashboard4:false,closeDashboard4:false}


let result = headArray.map((element, index) => { 
  let hideKey = `hideDashboard${index+1}`;
  let closeKey = `closeDashboard${index+1}`;
  return {[element]: {
    [hideKey]:dashboardstatus[hideKey],
    [closeKey]:dashboardstatus[closeKey]
  }}
})

console.log(result);

【讨论】:

    【解决方案2】:

    解决方法如下:-

    $scope.headArray = ['Online & Open Alarms', 'Sites Overview', 'Active Alarms', 'Hidden Alarms'];
    
    $scope.dashboardstatus = {
      hideDashboard1: true,
      closeDashboard1: false,
      hideDashboard2: true,
      closeDashboard2: true,
      hideDashboard3: false,
      closeDashboard3: false,
      hideDashboard4: false,
      closeDashboard4: false
    }
    $scope.dashArray = [];
    
    for (var i = 0; i < $scope.headArray.length; i++) {
      //form the child object first
      var objFirstChild = "hideDashboard" + (i + 1);
      var objSecondChild = "closeDashboard" + (i + 1);
      var childObj = {};
      childObj["hideDashboard" + (i + 1)] = $scope.dashboardstatus[objFirstChild];
      childObj["closeDashboard" + (i + 1)] = $scope.dashboardstatus[objSecondChild];
      //form the parent object and push it into array
      var parentObj = {}
      parentObj[$scope.headArray[i]] = childObj;
      $scope.dashArray.push(parentObj);
    }
    
    
    console.log($scope.dashArray);
    

    简单 JavaScript 中的简化方式,如下:-

    var headArray = ['Online & Open Alarms', 'Sites Overview', 'Active Alarms', 'Hidden Alarms'];
    
    var dashboardstatus = {
      hideDashboard1: true,
      closeDashboard1: false,
      hideDashboard2: true,
      closeDashboard2: true,
      hideDashboard3: false,
      closeDashboard3: false,
      hideDashboard4: false,
      closeDashboard4: false
    }
    var dashArray = [];
    
    for (var i = 0; i < headArray.length; i++) {
      var objFirstChild = "hideDashboard" + (i + 1);
      var objSecondChild = "closeDashboard" + (i + 1);
      var childObj = {};
      childObj["hideDashboard" + (i + 1)] = dashboardstatus[objFirstChild];
      childObj["closeDashboard" + (i + 1)] = dashboardstatus[objSecondChild];
      var parentObj = {}
      parentObj[headArray[i]] = childObj;
      dashArray.push(parentObj);
    }
    
    
    console.log(dashArray);

    【讨论】:

    【解决方案3】:

    您并不遥远,您正在寻找的是计算属性(或者只是在创建对象后设置属性名称)。您可以在属性初始化程序中使用 : 左侧的 [expression] 来计算属性名称。

    我会使用map

    const headArray=['Online & Open Alarms','Sites Overview','Active Alarms','Hidden Alarms'];
    
    const dashboardstatus = {hideDashboard1:true,closeDashboard1:false,hideDashboard2:true,closeDashboard2:true,hideDashboard3:false,closeDashboard3:false,hideDashboard4:false,closeDashboard4:false}
    
    const dashArray = headArray.map((name, index) => {
      const hide = "hideDashboard" + (index + 1);
      const close = "closeDashboard" + (index + 1);
      return {
        [name]: {[hide]: dashboardstatus[hide], [close]: dashboardstatus[close]}
      };
    });
    
    console.log(dashArray);
    .as-console-wrapper {
      max-height: 100% !important;
    }

    请注意,从 ES2015 开始,计算属性名称是新的(ish)。在 ES2015 之前,您必须先创建对象,然后添加属性。 map 回调的主体是:

    const hide = "hideDashboard" + (index + 1);
    const close = "closeDashboard" + (index + 1);
    const obj = {};
    const value = {};
    value[close] = dashboardstatus[close];
    value[hide] = dashboardstatus[hide];
    obj[name] = value;
    return obj;
    

    但如果您不想使用map,这里有一个对您现有代码的改动很小的版本:

    const headArray=['Online & Open Alarms','Sites Overview','Active Alarms','Hidden Alarms'];
    
    const dashboardstatus = {hideDashboard1:true,closeDashboard1:false,hideDashboard2:true,closeDashboard2:true,hideDashboard3:false,closeDashboard3:false,hideDashboard4:false,closeDashboard4:false}
    
    const dashArray = [];
    
    // Note that you had $scope.headingArray, not $scope.headArray, but you showed
    // $scope.headArray when showing the array's contents
    for (var i = 0; i < headArray.length; i++) {
      const close = 'closeDashboard' + (i + 1); // <== Note the + before (i + 1) to do string
      const hide  = 'hideDashboard' + (i + 1);  // concatenation, was missing from one of yours
      dashArray.push({
        [headArray[i]]: // <== computed property name, note : not , after it
        {
          [close]: dashboardstatus[close], // <== Another computed property name
          [hide]:  dashboardstatus[hide]   // <== And another
        }
      });
    }
    
    console.log(dashArray);
    .as-console-wrapper {
      max-height: 100% !important;
    }

    同样,在 ES2015 之前,您必须先创建对象,然后添加属性。 for 循环的主体是:

    const close = 'closeDashboard' + (i + 1);
    const hide  = 'hideDashboard' + (i + 1);
    const obj = {};
    const value = {};
    value[close] = dashboardstatus[close];
    value[hide] = dashboardstatus[hide];
    obj[headArray[i]] = value;
    dashArray.push(obj);
    

    也就是说,您可能需要重新审视您的结构。显然,在不了解更多信息的情况下无法确定(这超出了您最初问题的范围),但这种结构看起来可能比实际情况更复杂。

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多