我正在使用Vue.js
我想要从多维数组中获得一个名为'name'
的列。
我不确定这个多维数组的尺寸大小。
样品阵列在这里
{
"form":{
"id":"123465",
"title":"User Information",
"fields":[
{
"type":"date",
"title":"Document date",
"name":"document_date",
"required":true
},
{
"type":"input",
"title":"Document no",
"name":"document_no",
"required":true
}
],
"tabs":{
"xxx-general":{
"title":"General",
"fields":[
{
"type":"date",
"title":"DOB",
"name":"dob"
},
{
"type":"toggle",
"title":"Keep my profile private",
"name":"is_private"
},
]
},
"xxx-times":{
"title":"Ticket",
"fields":[
{
"type":"datetime",
"title":"Arrival time",
"name":"arrival_time"
},
[
{"type":"number","title":"Quantity","name":"quantity"},
{"type":"currency","title":"Price","name":"price"}
]
]
}
}
}
}
我知道PHP中有array_column
个函数,我想使用与此PHP函数等效的javascript函数。
任何人都可以帮助我
答案 0 :(得分:0)
没有执行深度查找的本机方法,但实现起来却很简单:
//return an array of objects according to key, value, or key and value matching
function getObjects(obj, key, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getObjects(obj[i], key, val));
} else
//if key matches and value matches or if key matches and value is not passed (eliminating the case where key matches but passed value does not)
if (i == key && obj[i] == val || i == key && val == '') { //
objects.push(obj);
} else if (obj[i] == val && key == ''){
//only add if the object is not already in the array
if (objects.lastIndexOf(obj) == -1){
objects.push(obj);
}
}
}
return objects;
}
//return an array of values that match on a certain key
function getValues(obj, key) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getValues(obj[i], key));
} else if (i == key) {
objects.push(obj[i]);
}
}
return objects;
}
//return an array of keys that match on a certain value
function getKeys(obj, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getKeys(obj[i], val));
} else if (obj[i] == val) {
objects.push(i);
}
}
return objects;
}
var json = '{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","ID":"44","str":"SGML","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}';
var js = JSON.parse(json);
//example of grabbing objects that match some key and value in JSON
console.log(getObjects(js,'ID','SGML'));
//returns 1 object where a key names ID has the value SGML
//example of grabbing objects that match some key in JSON
console.log(getObjects(js,'ID',''));
//returns 2 objects since keys with name ID are found in 2 objects
//example of grabbing obejcts that match some value in JSON
console.log(getObjects(js,'','SGML'));
//returns 2 object since 2 obects have keys with the value SGML
//example of grabbing objects that match some key in JSON
console.log(getObjects(js,'ID',''));
//returns 2 objects since keys with name ID are found in 2 objects
//example of grabbing values from any key passed in JSON
console.log(getValues(js,'ID'));
//returns array ["SGML", "44"]
//example of grabbing keys by searching via values in JSON
console.log(getKeys(js,'SGML'));
//returns array ["ID", "SortAs", "Acronym", "str"]
参考:http://techslides.com/how-to-parse-and-search-json-in-javascript
答案 1 :(得分:0)
正如其他人已经说过的那样,JavaScript中没有本机解决方案(作为函数)。相反,您必须使用多个步骤。您可能需要创建一些通用功能,以备后用。
提示:为了您的可读性更好,我简化了示例数据!
var DATA = {
"form":{
"id":"123465",
"title":"User Information",
"fields":[
{
"type":"date",
"title":"Document date",
"name":"document_date",
"required":true
},
{
"type":"input",
"title":"Document no",
"name":"document_no",
"required":true
}
],
"tabs":{
// ... shortened ...
}
}
}
// ====== GENERAL PURPOSE FUNCTIONS ======
function prop (path, obj) {
return path.split('.').reduce(function (p, name) {
return p == null ? p : p[name];
}, obj);
}
function mapMaybe (func, arr) {
return Array.isArray(arr) ? arr.map(func) : [];
}
function mapDeep (path, func, obj) {
return mapMaybe(func, prop(path, obj));
}
// ====== SOLUTION ======
console.log(mapDeep('form.fields', function (x) { return x.name; }, DATA))
答案 2 :(得分:0)
只需为先前的答案添加一个解决方案即可:
const data = {
"form":{
"id":"123465",
"title":"User Information",
"fields":[
{
"type":"date",
"title":"Document date",
"name":"document_date",
"required":true
},
{
"type":"input",
"title":"Document no",
"name":"document_no",
"required":true
}
],
"tabs":{
"xxx-general":{
"title":"General",
"fields":[
{
"type":"date",
"title":"DOB",
"name":"dob"
},
{
"type":"toggle",
"title":"Keep my profile private",
"name":"is_private"
},
]
},
"xxx-times":{
"title":"Ticket",
"fields":[
{
"type":"datetime",
"title":"Arrival time",
"name":"arrival_time"
},
[
{"type":"number","title":"Quantity","name":"quantity"},
{"type":"currency","title":"Price","name":"price"}
]
]
}
}
}
};
const re = /"name"\s*:\s*"(.+?)(?<!\\)"/g;
const names = [];
const json = JSON.stringify(data);
let p;
while ((p = re.exec(json)) !== null) {
names.push(p[1]);
}
console.log(names);