【问题标题】:Generate an array by comparing two arrays and add a key dynamically通过比较两个数组并动态添加一个键来生成一个数组
【发布时间】:2016-06-16 09:10:16
【问题描述】:

我的应用程序从 API 接收数据并将其保存在 $scope.newz 中。

bookmarkData 是从 LocalStorage 加载的。

我正在比较 $scope.newz$scope.bookmarkData 这两个数组的 contentId 的值。

我不知道如何保存bookmarkstate : true 仅用于匹配的数组项

最后将匹配的记录添加到$scope.AllnewsList

这是我的代码

if(data.Status.ResponseCode == 200)
  { 
    $("#fetchnews").hide();

    // $("#nodata").show();

    $("#sError").hide();

    //$scope.AllnewsList =  data.contents;

    $scope.newz = data.contents; 
    $scope.bookmarkData = JSON.parse(window.localStorage.getItem('bookmark'));

    for (var i=0; i < $scope.newz.length; i++)
    {
      for (var j=0; j < $scope.bookmarkData.data.length; j++) 
      {
        if ($scope.newz[i].ContentId == $scope.bookmarkData.data[j].ContentId)
          {
            // console.log($scope.newz[i].ContentId);
            $scope.bookmarkstate == true; 
          }
          else
          {
            $scope.bookmarkstate == false;
          }
      }
    }
    $scope.AllnewsList = $scope.newz;
  }

【问题讨论】:

  • shahrukh,您能否定义您的数组以供我们参考...?
  • @Tirthraj Barot 我的 2 个数组是 1)$scope.newz(包含来自服务的数据)和我的 2)$scope.bookmarkData(保存在本地)我想比较那里的 id 和时间他们匹配我只想设置那里的状态。并且相同的状态应该反映在 3) $scope.AllnewsList 中以显示在我的新闻中。
  • state 是属性还是 $state?
  • $state - 这基本上是为数据添加书签,即使服务被刷新,书签状态也应该为标记的数据保持真实。
  • Shahrukh,angularjs 中的 $state 是不同的......看看这个......angular-ui.github.io/ui-router/site/#/api/…

标签: javascript arrays angularjs


【解决方案1】:

如果我理解正确,您希望注册每个newz,无论您是否至少有一个书签。

如果您想这样做,我建议您将 $scope.bookmarkstate 设置为与 newz 数组大小相同的数组。

这样,如果"newz" 数组中的相应单元格包含书签,您就可以在其每个单元格中注册。

if(data.Status.ResponseCode == 200)
    { 
       $scope.bookmarkstate = [];
       $("#fetchnews").hide();
       $("#sError").hide();
      $scope.newz = data.contents; 
      $scope.bookmarkData = JSON.parse(window.localStorage.getItem('bookmark'));
       for (var i=0; i < $scope.newz.length; i++)
        {
          for (var j=0; j < $scope.bookmarkData.data.length; j++) 
          {
              if ($scope.newz[i].ContentId == $scope.bookmarkData.data[j].ContentId)
               {
                 $scope.bookmarkstate[i] == true; 
              }
              else
              {

                 $scope.bookmarkstate[i] == false;
              }
          }
      }
       $scope.AllnewsList = $scope.newz;
   }

让我知道你的效果如何。 干杯。

【讨论】:

  • 感谢您的回复,但我比较了 $scope.newz 和 bookmarkData 这两个数组,并且我比较了 id(ContentId) 如果它们匹配,那么状态应该是 true。
【解决方案2】:

假设您在评论中提到的键并假设动态数据,我以以下方式定义您的数组..

如果我误解了你的问题,请纠正我

var newz = [{contentId : 1, source : 'demoSrc1', title:'title1' },
{contentId : 2, source : 'demoSrc2', title:'title2' },
{contentId : 3, source : 'demoSrc3', title:'title3' },
{contentId : 4, source : 'demoSrc4', title:'title4' },
{contentId : 5, source : 'demoSrc5', title:'title5' },
{contentId : 6, source : 'demoSrc6', title:'title6' },
{contentId : 7, source : 'demoSrc7', title:'title7' },
{contentId : 8, source : 'demoSrc8', title:'title8' }];
//I defined your newz statically for simplicity.

var bookmarkData = [{contentId : 1, source : 'demoSrc1', title:'title1' },
{contentId : 4, source : 'demoSrc4', title:'title4' },
{contentId : 6, source : 'demoSrc6', title:'title6' },
{contentId : 8, source : 'demoSrc8', title:'title8' }];
//SIMILARLY id defined your bookmarkData statically.


var AllnewsList = [];


    for (var i=0; i <  newz.length; i++)
    {
      for (var j=0; j < bookmarkData.length; j++) 
      {
            if (newz[i].contentId == bookmarkData[j].contentId)
          {

            newz[i].bookmarkstate = true; 
            AllnewsList.push(newz[i]);
//            console.log(newz[i]);
          }
          else
          {
            newz[i].bookmarkstate = false;
          }
  //        console.log(newz[i].contentId);

      }
    }
console.log(AllnewsList);

【讨论】:

  • 非常感谢您的帮助好友。我想出了另一种方法来完成这项工作。哪个更好从api获取false值,然后在本地更改它然后比较。
【解决方案3】:
Tip : You are not using assignment operator in your code to store status and i will recommend you to use
underscore for this tasks if you want to minimize lines of code.

If i understand you correctly the bookmarkstate array  will have true value for each news if news ContentId is equal to each bookmarkData ContentId else it will store false for each news.
var bookmarkstate = [];
var newz = [
    {
        id: 1,
        name: "first",
        ContentId: 3
    },

    {
        id: 2,
        name: "second",
        ContentId: 33
    },
    {
        id: 3,
        name: "third",
        ContentId: 3
    }

];
var bookmarkData = [
    {
        id: 1,
        name: "first",
        ContentId: 3
    },

    {
        id: 2,
        name: "second",
        ContentId: 33
    },
    {
        id: 3,
        name: "third",
        ContentId: 3
    }

];

for (var i = 0; i < newz.length; i++) {
    for (var j = 0; j < bookmarkData.length; j++) {
        if (newz[i].ContentId == bookmarkData[j].ContentId) {
            bookmarkstate[i] = true; // you were not using assignment operator
        } else {
            bookmarkstate[i] = false;// ou were not using assignment operator
        }

    }
}
console.log(bookmarkstate);

【讨论】:

  • 好吧,让它更具体地介绍我的应用程序。我正在开发一个新闻应用程序,其中每篇文章都有(ContentId)我有书签按钮,当单击按钮(颜色或图标更改)时,数据存储在本地存储中。我的问题是当我用新新闻更新我的新闻 atricles 时,书签按钮(颜色)显示为 false(好像数据没有添加书签)所以我想防止这种情况发生。并显示新闻已加入书签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多