在for循环对象中构建自定义输出

时间:2016-05-19 05:49:56

标签: javascript angularjs

我有一个json对象,但想将输出格式化为变量。

var json =  [
   {
      "link-params": {
         "location_id": 1
      },
      "link-text": "United States"
   },
   {
      "link-params": {
         "location_id": 9
      },
      "link-text": "Florida"
   }
]

 for(var i = 0; i < json.length; i++) {
   var data = json[i]['link-text'];
 }

//output United States / Florida

我希望输出像美国/佛罗里达州

你知道如何在javascript中执行此操作吗?我正在使用angular.js

4 个答案:

答案 0 :(得分:1)

请试试这个

#include <sys/types.h>
#include <sys/stat.h>

#include <sys/types.h>
#include <unistd.h>

#include <stdlib.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>


#define _GNU_SOURCE
#include <limits.h>

void helper(DIR *, struct dirent *, struct stat, char *, int, char **);
void dircheck(DIR *, struct dirent *, struct stat, char *, int, char **);

int main(int argc, char *argv[]){

  DIR *d;

  // Create dirent struct
  struct dirent *dir;

  // Create stat struct
  struct stat buf;

  // current path for file
  char currentPath[FILENAME_MAX];

  // Depth for tree
  int depth = 0; 


  // Checking for correct usage
  if (argc != 2) {
    printf("Usage: './gls <directory_name>'\n");
    exit(0);
  }

  // Checking that file provided in command line actually exists
  if (lstat(argv[(argc - 1)], &buf) < 0) {
    printf("Error: No such file exists.\n");
    return 1;
    exit(0);
  }

  // General resource for printing files: http://stackoverflow.com/questions/4204666/how-to-list-files-in-a-directory-in-a-c-program%20*/

  // Open the current directory
  d = opendir (".");

  if(d == NULL) {
    printf("Error opening directory.\n");
    return 1;
  }

  // Store the current directory into currentPath
  if((getcwd(currentPath, FILENAME_MAX)) == NULL) {
    printf("Error: No such file exists.\n");
    return 1;
  }

  // Iterate through all items in directory
  while((dir = readdir(d)) != NULL){

    // Do not process . and ..
    if(strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
      continue;

    // Forms the path for lstat
    getcwd(currentPath, FILENAME_MAX);
    strcat(currentPath, "/");
    strcat(currentPath, dir->d_name);
    if(lstat(currentPath, &buf) == -1){
      perror("stat");
      printf("Error could not open file\n");
    }
    getcwd(currentPath, FILENAME_MAX);

    // Checks if file is a regular file
    if(S_ISREG(buf.st_mode))
    printf("| %s (regular file - %d - !checksum)\n", dir->d_name, (int)buf.st_size);

    // Checks if file is a directory
    else if(S_ISDIR(buf.st_mode)) {
      printf("| %s (directory)\n", dir->d_name);
      dircheck(d, dir, buf, currentPath, depth, argv);
    }

    // Checks if file is a symbolic link
    else if(S_ISLNK(buf.st_mode)) {

      // Resource used for absolute and relative paths: http://www.apiexamples.com/c/stdlib/realpath.html 
      char resolved_path[PATH_MAX];
      realpath(currentPath, resolved_path);         
      printf("| %s (symbolic link - %s)\n", dir->d_name, resolved_path);
    }

    // Checks if file is a FIFO
    else if(S_ISFIFO(buf.st_mode)) {
      printf("| %s (fifo (named pipe))\n", dir->d_name);
    }
  }
  // Close the directory and return 0 for success
  closedir(d);
  return 0;
}

// Recursive helper 
// Resource used for some of helper function and dircheck function: http://stackoverflow.com/questions/4989431/how-to-use-s-isreg-and-s-isdir-posix-macros
void helper(DIR *d, struct dirent *dir, struct stat buf, char currentPath[FILENAME_MAX], int depth, char *argv[]){
  int i = 0;

  // Open directory in currentPath
  if((d = opendir(currentPath)) == NULL)
    printf("Error: Failed to open Directory ==> %s\n", currentPath);

  // Read through directory
  while((dir = readdir(d)) != NULL){

    // If file is . or .. ignore
    if(strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)
      continue;

    getcwd(currentPath, FILENAME_MAX);
    strcat(currentPath, "/");
    strcat(currentPath, dir->d_name);

    getcwd(currentPath, FILENAME_MAX);

    // If file is a register
    if(S_ISREG(buf.st_mode)){
      for(i = 0; i < depth; i++) {
        printf("    ");
        printf("%s (%d bytes)\n", dir->d_name, (int)buf.st_size);
      }
    }

    // If file is a directory
    if(S_ISDIR(buf.st_mode)) {
      if(strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0) {
        dircheck(d, dir, buf, currentPath, depth, argv);
      }
    }
  }

  // Change directory back
    chdir("..");
    closedir(d);
}


// Resource used as guideline in order to create helper and dircheck functions
// http://stackoverflow.com/questions/4989431/how-to-use-s-isreg-and-s-isdir-posix-macros
void dircheck(DIR *d, struct dirent *dir, struct stat buf, char currentPath[FILENAME_MAX], int depth, char *argv[]){

  int i = 0;
  strcat(currentPath, "/");
  strcat(currentPath, dir->d_name);

  // If two directories exists at the same section in the tree
  if((chdir(currentPath)) == -1){
    getcwd(currentPath, FILENAME_MAX);
    strcat(currentPath, "/");
    strcat(currentPath, dir->d_name);

    getcwd(currentPath, FILENAME_MAX);

    // Add --- based on the depth of the tree
    for(i = 0; i <= depth; i++)
      printf ("---");
    printf("| %s (subdirectory)\n", dir->d_name);
    depth++;
    helper(d, dir, buf, currentPath, depth, argv);
  }

  else{
    // Add --- based on the depth of the tree
    for(i =0; i <= depth; i++)
      printf("---");
    printf("| %s (subdirectory)\n", dir->d_name);
    chdir(currentPath);
    depth++;
    helper(d, dir, buf, currentPath, depth, argv);
  }
}

答案 1 :(得分:0)

您应该先声明data,使其对json对象的所有迭代都可见,然后将值连接到它,而不是每次都覆盖它。

 var data = '';
 for(var i = 0; i < json.length; i++) {
   data += json[i]['link-text'];
   if(i !== json.length - 1) data += ' / ';  
 }

答案 2 :(得分:0)

试试这个

var myApp = angular.module('myApp',[]);

function DetailCtrl($scope) {
  $scope.json =  [
   {
      "link-params": {
         "location_id": 1
      },
      "link-text": "United States"
   },
   {
      "link-params": {
         "location_id": 9
      },
      "link-text": "Florida"
   }
];
  var data = [];
  var item = "";
  angular.forEach($scope.json,function(value,key){
         angular.forEach(value,function(v,k){
             if(k == "link-text")
               item = item +v+"/";
           });
            
      });
  data.push(item);
 console.log(data);
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="DetailCtrl">
  
</div>

答案 3 :(得分:0)

您可以使用Array.prototype.reduce,并以更加实用的方式编写代码,如下所示

json.reduce(function(html, link){
    return html + (link['link-text'] ? link['link-text'] + ( json.indexOf(link) != json.length - 1 ?  ' / ' : '') : '');
}, '');

演示:JSFiddle