【问题标题】:Looping through json data using angular and filling in missing values使用角度遍历json数据并填充缺失值
【发布时间】:2015-12-20 12:52:12
【问题描述】:

所以我遇到了这个问题,我使用来自外部 json 文件的数据填充范围输入...

所以基本上数据有一堆对象,每个对象都有一组值和文本。但是有些对象没有连续的值来循环并在范围滑块上输出,如下所示:

var someObj = [
  {
    value: 1,
    text: 'A'
  },
  {
    value: 2,
    text: 'B'
  },
  {
    value: 3,
    text: 'C'
  },
  {
    vaule: 5,
    text: 'D'
  },
  {
    value: 6,
    text: 'E'
  },
  {
    vaule: 8,
    text: 'F'
  }
];

请注意缺少 Value: 4 和 value: 7 ,这也可以改变,例如在某些对象中 value: 11 和 value: 13 也缺少。

所以基本上我需要实现的是循环遍历每个对象,如果缺少值以添加值并从之前的值复制文本值,例如...

var someObj = [
  {
    value: 1,
    text: 'A'
  },
  {
    value: 2,
    text: 'B'
  },
  {
    value: 3,
    text: 'C'
  },
  {
    vaule: 5,
    text: 'D'
  },
  {
    value: 6,
    text: 'E'
  },
  {
    vaule: 8,
    text: 'F'
  }
];

会变成

var someObj = [
  {
    value: 1,
    text: 'A'
  },
  {
    value: 2,
    text: 'B'
  },
  {
    value: 3,
    text: 'C'
  },
  {
    value: 4,
    text: 'C'
  },
  {
    vaule: 5,
    text: 'D'
  },
  {
    value: 6,
    text: 'E'
  },
  {
    vaule: 7,
    text: 'E'
  },
  {
    vaule: 8,
    text: 'F'
  }
];

这可能吗?如果可以,请问我该怎么做??

提前致谢

【问题讨论】:

  • 你的价值会有增量吗? (1,2,3,4,5,6)
  • 所以数组是递增的,但可能缺少值,我想创建一个新对象,该对象的所有值都递增,之前缺失的值基本上被填充,文本复制上一个所以

标签: javascript json angularjs loops duplicate-data


【解决方案1】:
var i=0;
do{
if(someObj[i].value!=i+1){
    var obj = {}
    debugger;
    obj['value']= i+1;
    obj['text']= someObj[i-1].text;
    someObj.splice(i,0,obj);
}
i++;

}while(i<someObj.length);

参考这个:https://jsfiddle.net/cw5kkpgu/

【讨论】:

  • 改变答案。请参考。
  • 所以我们喜欢你的解决方案,它确实有效,但我们发现实际上数据可能以各种数字开头,我们需要脚本从最低数字递增到最高数字而不是开始从 0
  • 我们确实考虑过设置 var i = 最低值,但这似乎会增加每一个说第三个值或最低值是什么......关于如何捕获最低值和增量的任何想法从他们的而不是 0?
  • 好吧,我们破解了它,这里的小提琴以正确的百分比值开始和结束jsfiddle.net/guideveloper/xnaqtq9y/11
【解决方案2】:

获取最后一个对象的值如

var someObjLength = someObj[someObj.length-1].value;

for(i = 0; i < someObjLength-1; i++) {

    if(someObj[i].value != (i+1)){

        someObj.splice(i, 0, {value: i+1, text: someObj[i-1].text})

    }

}

【讨论】:

    【解决方案3】:

    我创建了一个js函数来补全缺失的对象。 让我知道它是否有效。

    function completeObject(someObj)
    {
        var otherObj = [];
        for(var obj in someObj)
        {
          otherObj[someObj[obj]['value']] = someObj[obj];
        }
    
        var j = 0;
        for(var i =1 ; i <= someObj[someObj.length-1]['value'];i++)
        {
          if(otherObj[i] === undefined)
          {
            var obj = {}
            obj['value']= i;
            obj['text']= otherObj[j]['text'];
            otherObj.push(obj);
          }
          else
          {
            j = i ;
          }
        }
    
        return otherObj;
    }
    

    【讨论】:

      【解决方案4】:

      好的,我现在终于解决了,抱歉,最初并没有完全理解你在追求什么,但这里是 Plunker:

      http://plnkr.co/edit/n1tSfj2YJMeBZNZCSAF3?p=preview

      请确认是不是:)

      关键是:

      $scope.loop = function(){
        var previousText = '';
        var previousValue = '';
        var newObject = [];
      
        angular.forEach($scope.someObj, function(object){
      
          if(object.value == 1){
            newObject.push(object);
            previousText = object.text;
            previousValue = object.value;
            console.log("value:" + previousValue + " | Text:" + previousText);
          }
          else {
            if(object.value != (previousValue + 1)){
              while (object.value != (previousValue + 1)){
                  previousValue += 1;
                  newObject.push({ value: previousValue, text: previousText})
      
                  console.log("value:" + previousValue + " | Text:" + previousText);
              }
            }
            else{
                  newObject.push(object);
                  previousValue = object.value;
      
                  console.log("value:" + previousValue + " | Text:" + previousText);
            }
      
            previousText = object.text;
          }
      
        });
      
        // Add the last value as it's always missed
        newObject.push($scope.someObj[$scope.someObj.length - 1])
      
        $scope.someObj = newObject;
      }
      

      【讨论】:

      • 这有点像我要找的东西,但在数据中最后一个值为 11,所以当你点击 push me 时,需要有一个包含所有 11 个步骤的新对象,而那些缺失的则已填写这个例子似乎保留了它的步数并重新排序了值。
      • bukke hari prasad 是一个更好的解决方案
      猜你喜欢
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2018-12-14
      相关资源
      最近更新 更多