【问题标题】:How to take the last value in certain property from JSON in Angularjs如何从Angularjs中的JSON中获取某些属性中的最后一个值
【发布时间】:2016-03-08 14:34:44
【问题描述】:

我的 app.js 中有这段代码,用于在我的应用程序中发送聊天和阅读聊天

$scope.messageshistory = {};
$scope.tmp = {};

    // send message
    $scope.sendMessage = function(){
        $scope.messages = {
            from      : $scope.datauser['data']['_id'],
            fromname  : $scope.datauser['data']['nama'],
            to        : $scope.tmpuserid,
            message   : $scope.tmp['sendmessage'],
            time      : moment()
        };
          //event emit message
        socket.emit('message',$scope.messages,function(callback){       
          if(!callback['error']){
                 $scope.messages['time'] = moment($scope.messages['time']).format('DD-MMMM-YYYY HH:MM');


                if ($scope.messageshistory.hasOwnProperty($scope.tmpuserid)){ //yg di json yg paling awal
                    $scope.messageshistory[$scope.tmpuserid].push($scope.messages);
                }else{
                    $scope.messageshistory[$scope.tmpuserid] =   [];
                    $scope.messageshistory[$scope.tmpuserid].push($scope.messages);
                }
                $scope.tmp['sendmessage'] = '';
          }else{
               var msg = callback['error'];
                navigator.notification.alert(msg,'','Error Report', 'Ok');
            }

            $scope.$apply();
        });
    };
      //event read message
    socket.on('message', function (data) {

        window.plugin.notification.local.add({
            id        :   moment(),
            title     :   data['fromname'],
            message   :   data['message'].substr(0,20) + ' ...',
            led       : 'A0FF05',
            json      :   JSON.stringify({ routes:'chat', nama :data['fromname'],from:data['from'] })
        });
        data['time'] = moment(data['time']).format('DD-MMMM-YYYY HH:MM');
        if ($scope.messageshistory.hasOwnProperty(data['from'])){
            $scope.messageshistory[data['from']].push(data);
        }else{
            $scope.messageshistory[data['from']] =   [];
            $scope.messageshistory[data['from']].push(data);
        }

        for(var i = 0; i<= $scope.datauser['data']['friends'].length; i++){
            if($scope.datauser['data']['friends'][i]['userid'] == data['from']){
                $scope.datauser['data']['friends'][i]['ischat'] = true;
                break;
            }
        };
        $scope.$apply();
    });

我的问题是如何从$scope.messageshistory 获取消息属性中的最后一个值,因为$scope.messages 用于发送消息,$scope.messageshistory 用于保留聊天记录。这是聊天活动图片:

仅从这个活动中,$scope.messageshistory 会将其中的数据保存为 JSON 格式:

{
    "5512": [{
        "from": "561c",
        "fromname": "ryan",
        "to": "5512",
        "message": "hey",
        "time": "18-Maret-2016 21:03"
    }, {
        "from": "5512",
        "fromname": "sasa",
        "to": "561c",
        "message": "hello",
        "time": "18-Maret-2016 21:03",
        "_id": "593s"
    }]
}

我通过使用angular.toJson($scope.messageshistory) 得到这个值,如果聊天活动仍在继续,这个数组总是会加起来。我打算从$scope.messageshistory 获取消息属性中的最后一个值,以便在我的应用程序的文本转语音功能中使用。这是代码:

$scope.speakText = function() {

    TTS.speak({
           text: **this the place for the code**,
           locale: 'en-GB',
           rate: 0.75
       }, function () {
          // handle the success case
       }, function (reason) {
           // Handle the error case
       });
  };

它将读取$scope.messageshistory 中的最后一条消息。那么,我必须编写什么代码来获取最后一个值?

【问题讨论】:

  • 看起来 $scope.messageshistory 是一个对象。您想获取特定 userId 键的最新消息?还是套接字发出的最新消息? $scope.messageshistory[$scope.tmpuserid][$scope.messageshistory[$scope.tmpuserid].length-1] 呢?
  • @cl3m 等我试试
  • @cl3m 它可以工作,但它仍然是所有属性,如何获取“消息”属性

标签: javascript android angularjs json cordova


【解决方案1】:

您必须执行以下操作:

var msgs = $scope.messageshistory[$scope.tmpuserid]
var yourLastMessage = msgs[msgs.length-1].message
// you could also add a quick check so you don't get
// an error if the messages array is emtpy :
// var yourLastMessage = (msgs && msgs[msgs.length-1] ? msgs[msgs.length-1].message : null)

编辑

根据您的评论进行一些解释:

var msgs = $scope.messageshistory[$scope.tmpuserid]
// msgs is now an Array containing Objects
// [{message : 'xxx'},{message : 'yyy'}]
// we take the last entry of the msgs Array (msgs.length-1)
// so msgs[msgs.length-1] is the last object ({message : 'yyy'})
// and finally we take the 'message' property' of that object:
var yourLastMessage = msgs[msgs.length-1].message

【讨论】:

  • 它的工作就像一个魅力,感谢您的回答。最后一个问题,我写var yourLastMessage = (msgs &amp;&amp; msgs[msgs.length-1] ? msgs[msgs.length-1].message : null) 还是写var yourLastMessage = msgs[msgs.length-1].message 更好?
  • 由于您总是在数组中推送一个值($scope.messageshistory[$scope.tmpuserid].push($scope.messages);),因此您可以合理地跳过测试
  • 你能看看我之前的问题吗? stackoverflow.com/questions/35811385/… 如果你不介意的话。在那个问题中,当用户在home 页面中时,我想让后退按钮硬件成为退出应用程序。谢谢
  • 你之前的问题已经有很多很好的答案了。你试过了吗?你能发布更多的html代码,特别是后面的&lt;button&gt;标签,以及你的角度控制器吗?
  • 我很抱歉问这个问题,但你能解释一下为什么这是有效的吗?谢谢队友:D
【解决方案2】:

假设历史对象中的键是升序数字并考虑到对象中键的顺序未由 W3C 指定,您将必须执行以下操作:

  1. 获取所有密钥
  2. 找到“最新的”(因此是最大的数字)
  3. 获取它

例如,你可以这样做

var keys = Object.keys($scope.messagehistory);
keys.sort (function (a, b) {
  return a - b;
});
var result = keys[keys.length - 1];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多