如何在JSON中获取密钥的值

时间:2017-03-04 08:49:54

标签: javascript jquery json

我有一个像这样的JSON:

var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];

如何获得每个属性的特定属性(让我们说我想要strNumOfDays)?我必须使用$ .each()?

5 个答案:

答案 0 :(得分:2)

  

我必须使用$ .each()吗?

你需要一些类型的循环结构,是的。例如,for循环,或Array.prototype的功能,或ES2015(又名" ES6")以及后来的for-of循环,或者是,你可以使用jQuery' $.each$.map。例如,我们可以使用arrStages.map获取这些值的数组:

var days = arrStages.map(function(entry) {
  return entry.strNumOfDays;
});

或者在ES2015 +中:

let days = arrStages.map(entry => entry.strNumOfDays);

示例(在ES5中):



var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];
var days = arrStages.map(function(entry) {
  return entry.strNumOfDays;
});
console.log(days);




This question's answers涵盖了在JavaScript中循环遍历数组的众多选项。

在ES2015及更高版本中,如果您不需要数组,但只需要循环显示数值,那么for-of循环就像这样:

for (let entry of arrStages) {
    // Use entry.strNumOfDays here...
}

答案 1 :(得分:1)

您还可以使用Javascript' map()forEach(),因为它是一个数组。它比$.each()更直接。



var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];

// map()
var newArray = arrStages.map(function(string) {
  return string.strNumOfDays;
});
console.log(newArray);

// map()
arrStages.forEach(function(string) {
  console.log(string.strNumOfDays);
});

// jQuery each()
$.each(arrStages, function(key) {
  console.log(arrStages[key].strNumOfDays);
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

Array.prototype.reduce()也可以使用。

它通过接收两个参数来工作 - 一个为数组上的每次迭代调用的函数和一个初始值。在第一次迭代中,初始值作为第一个参数(memo)传递给提供的函数。第二个参数是当前迭代的数组元素(curr)。我们只需在memo中推送所需的属性,然后返回memo。需要返回它,因为reduce()使用返回的值作为下一次迭代的memo。基本上,reduce()的第二个参数是一个空数组,我们在迭代之间传递新值时将其推送。该数组在最后一次迭代时返回并存储在days变量中。

&#13;
&#13;
var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];

var days = arrStages.reduce(function (memo, curr) {
  memo.push(curr.strNumOfDays);
  return memo;
}, []);

console.log(days);
&#13;
&#13;
&#13;

修改

@nnnnnn说map()更直截了当。这是真的,但它的灵活性稍差。例如,如果您想 strNumOfDays不是3的值

&#13;
&#13;
var arrStages = [                 
    { "strID" : "ID-0001" , "intStageNum" : 1 , "strNumOfDays": 1 }, 
    { "strID" : "ID-0003" , "intStageNum" : 3 , "strNumOfDays": 14}, 
    { "strID" : "ID-0002" , "intStageNum" : 2 , "strNumOfDays": 3 },
    { "strID" : "ID-0006" , "intStageNum" : 6 , "strNumOfDays": 3 },
    { "strID" : "ID-0004" , "intStageNum" : 4 , "strNumOfDays": 3 },
    { "strID" : "ID-0005" , "intStageNum" : 5 , "strNumOfDays": 3 },
];

var mappedDays = arrStages.map(function (elem) {
  if (elem.strNumOfDays !== 3) {
    return elem.strNumOfDays;
  }
});

var reducedDays = arrStages.reduce(function (memo, curr) {
  if (curr.strNumOfDays !== 3) {
    memo.push(curr.strNumOfDays);
  }
  return memo;
}, []);

console.log("map", mappedDays);
console.log("reduce", reducedDays);
&#13;
&#13;
&#13;

请注意map()始终保存返回的值。如果没有返回任何内容,则会保存undefined。使用reduce(),您可以控制确切添加的内容。

免责声明:我知道这不是问题的必要条件,我并不是说reduce()更好,我只想展示它的好处。

答案 3 :(得分:0)

您可以使用Array#map关闭所需密钥。

&#13;
&#13;
function getValues(key) {
    return function (object) {
        return object[key];
    };
}

var arrStages = [{ strID: "ID-0001" , intStageNum: 1 , strNumOfDays: 1 }, { strID: "ID-0003" , intStageNum: 3 , strNumOfDays: 14}, { strID: "ID-0002" , intStageNum: 2 , strNumOfDays: 3 }, { strID: "ID-0006" , intStageNum: 6 , strNumOfDays: 3 }, { strID: "ID-0004" , intStageNum: 4 , strNumOfDays: 3 }, { strID: "ID-0005" , intStageNum: 5 , strNumOfDays: 3 }];

console.log(arrStages.map(getValues('strNumOfDays')));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 4 :(得分:0)

这是解决您问题的ES6解决方案:

arrStages.forEach((arrStage) => {
    console.log(arrStage["strNumOfDays"]);
});

我认为这就是你想要的。

我希望它有所帮助。