如何使用 VueJS 或仅 javascript 在多维数组中进行搜索
How to search in a multi dimensional array using VueJS or just javascript
我正在做一个 Vue 项目,我只是 Vue JS 的新手,我的问题是如何 return id 为 1[=18 的所有数据=] 当我输入一个值时。下面是我的数据的示例结构。
{
'A': [{
1: [{
id: 1,
name: 'John'
}],
2: [{
id: 5,
name: 'Ken'
}]
}],
'B': [{
1: {
id: 1,
name: 'Leena'
}
}],
'C': [{
1: [{
id: 1,
name: 'Jesica'
}],
2: [{
id: 18,
name: 'Mike'
}]
}]
}
预期结果应该是(下图),因为它们都具有相同的 id 值
{
'A': [{
1: [{
id: 1,
name: 'John'
}]
}],
'B': [{
1: {
id: 1,
name: 'Leena'
}
}],
'C': [{
1: [{
id: 1,
name: 'Jesica'
}]
}]
}
如果您可以控制数据结构的格式,我会将其更改为更易于管理的格式。例如,将每个大写字母 属性 设置为一个对象数组:
let dataset = {
'A': [{id: 1, name: 'John'}, {id: 2, name: 'Sally'}],
'B': [{id: 1, name: 'Bob'}],
...
}
更好的方法是使数据结构成为对象数组,大写字母作为 group
属性 值,id-name 对象作为 people
属性 值(或任何对您有意义的值):
let dataset = [{
group: 'A', people: [{id: 1, name: 'John'}, {id: 2, name: 'Sally'}],
}, {
group: 'B', people: [{id: 1, name: 'Bob'}],
}, {
...
}]
使用这种结构,通过特定的id过滤数据会相对简单:
function filterObject(foo, id) {
return foo.map(i => i.people.filter(j => j.id == id));
}
如果您真的需要使用您提供的疯狂数据结构,这里有一个函数可以满足您的需要:
let filterObject = function(foo, id) {
let bar = {};
Object.keys(foo).map((key) => {
for (let i = 0; i < foo[key].length; i++) {
Object.keys(foo[key][i]).map((index) => {
for (let j = 0; j < foo[key][i][index].length; j++) {
if (foo[key][i][index][j].id != id) {
continue;
}
if (!bar[key]) {
bar[key] = [];
}
if (!bar[key][i]) {
bar[key][i] = {};
}
if (!bar[key][i][index]) {
bar[key][i][index] = [];
}
bar[key][i][index][j] = foo[key][i][index][j];
}
})
}
});
return bar
}
我正在做一个 Vue 项目,我只是 Vue JS 的新手,我的问题是如何 return id 为 1[=18 的所有数据=] 当我输入一个值时。下面是我的数据的示例结构。
{
'A': [{
1: [{
id: 1,
name: 'John'
}],
2: [{
id: 5,
name: 'Ken'
}]
}],
'B': [{
1: {
id: 1,
name: 'Leena'
}
}],
'C': [{
1: [{
id: 1,
name: 'Jesica'
}],
2: [{
id: 18,
name: 'Mike'
}]
}]
}
预期结果应该是(下图),因为它们都具有相同的 id 值
{
'A': [{
1: [{
id: 1,
name: 'John'
}]
}],
'B': [{
1: {
id: 1,
name: 'Leena'
}
}],
'C': [{
1: [{
id: 1,
name: 'Jesica'
}]
}]
}
如果您可以控制数据结构的格式,我会将其更改为更易于管理的格式。例如,将每个大写字母 属性 设置为一个对象数组:
let dataset = {
'A': [{id: 1, name: 'John'}, {id: 2, name: 'Sally'}],
'B': [{id: 1, name: 'Bob'}],
...
}
更好的方法是使数据结构成为对象数组,大写字母作为 group
属性 值,id-name 对象作为 people
属性 值(或任何对您有意义的值):
let dataset = [{
group: 'A', people: [{id: 1, name: 'John'}, {id: 2, name: 'Sally'}],
}, {
group: 'B', people: [{id: 1, name: 'Bob'}],
}, {
...
}]
使用这种结构,通过特定的id过滤数据会相对简单:
function filterObject(foo, id) {
return foo.map(i => i.people.filter(j => j.id == id));
}
如果您真的需要使用您提供的疯狂数据结构,这里有一个函数可以满足您的需要:
let filterObject = function(foo, id) {
let bar = {};
Object.keys(foo).map((key) => {
for (let i = 0; i < foo[key].length; i++) {
Object.keys(foo[key][i]).map((index) => {
for (let j = 0; j < foo[key][i][index].length; j++) {
if (foo[key][i][index][j].id != id) {
continue;
}
if (!bar[key]) {
bar[key] = [];
}
if (!bar[key][i]) {
bar[key][i] = {};
}
if (!bar[key][i][index]) {
bar[key][i][index] = [];
}
bar[key][i][index][j] = foo[key][i][index][j];
}
})
}
});
return bar
}