如何在javascript中保存对象中的不同值?

时间:2016-06-20 23:51:15

标签: javascript angularjs

我有一堆存储在变量中的日志数据。每个日志值包含摄像机名称和系统IP。我想创建一个对象,其名称为所有不同的系统ip和对应的值作为一个数组,其中包含与该系统ip对应的所有摄像机名称。以下是我的代码---

    $http(req).success(function(data){
    $scope.logs = data;
    $scope.cameras={};
    var v =$scope.logs[0].systemIp;
    $scope.cameras["v"]=[];
    $scope.cameras["v"].push($scope.logs[0].cameraName);
    for(i=1;i<$scope.logs.length;i++){
        v=$scope.logs[i].systemIp;
        var flag=0;
        for(j in $scope.cameras){
            if(j==="v")
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            $scope.cameras["j"]=[];
            $scope.cameras["j"].push($scope.logs[i].cameraName);
        }
        else if(flag==1)
        {
            $scope.cameras["v"].push($scope.logs[i].cameraName);
        }
    }});

这就是我的数据 -

    [{
    "_id": "57683fd82c77bb5a1a49a2aa",
    "cameraIp": "192.16.0.9",
    "cameraName": "garage2",
    "systemIp": "192.168.0.2"
    },
    {
    "_id": "57683f8e2c77bb5a1a49a2a9",
    "cameraIp": "192.16.0.8",
    "cameraName": "garage1",
    "systemIp": "192.168.0.2"
    },
    {
    "_id": "57683f5e2c77bb5a1a49a2a8",
    "cameraIp": "192.16.0.7",
    "cameraName": "Back Door",
    "systemIp": "192.168.0.4"
    }]

当我在我的控制台上打印$ scope.cameras时,它将此作为输出 -

    Object { v: Array[3] }

我希望相机对象看起来像这样 -

    { "192.168.0.2" : [ "garage1" , "garage2"] ,
      "192.168.0.4" : [ "Back Door"] }

我是javascript的新手,感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

如果您使用的是Lodash或Underscore库(我强烈推荐),您可以使用_.groupBy()功能来完成您的工作(以及其他一些功能以确保所有值都是唯一的)。

但是,您也可以自己轻松实现它:

function groupByDistinct(arr, prop, mapFn) {
    mapFn = mapFn || function (x) { return x; };
    var output = {};
    arr.forEach(function (item) {
        var key = item[prop],
            val = mapFn(item);
        if (!output[key]) {
            output[key] = [val];
            return;
        }
        if (output[key].indexOf(val) < 0) {
            output[key].push(val);
        }
    });
    return output;
}

将它用于您的代码,如下所示:

$scope.cameras = groupByDistinct(data, 'cameraIp', function (logEntry) { 
    return logEntry.cameraName;
});

答案 1 :(得分:2)

您正在传递一个字符串,例如"v""j"作为您的对象键,并且此字符串实际上是您的对象键结束而不是您想要的变量值。你可以使用这样的东西:

for(i=0; i < $scope.logs.length; i++){
    var _sysIp = $scope.logs[i].systemIp,
        _camName = $scope.logs[i].cameraName;

    if(!$scope.cameras.hasOwnProperty(_sysIp)) {
        $scope.cameras[_sysIp] = [_camName];
    } else if ($scope.cameras[_sysIp].indexOf(_camName) < 0) {
        $scope.cameras[_sysIp].push(_camName);
    }

}