我在JavaScript中有一个数组,例如
var input =['p1', 'p3'];
我的数据如下所示
var data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}
我需要根据输入数组过滤数据对象。是否有简单的ES6方法将其拉出。
Tia
答案 0 :(得分:4)
您可以简单地从输入数组开始并映射到数据:
var input =['p1', 'p3'];
var data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}
const result = input.map(x => data[x])
console.log(result)
只要您不需要遍历数据树即可。
如果您需要递归遍历对象树,则可以尝试如下操作:
var input = ['p1', 'p3', 'p4', 'pp'];
var data = {
p: {
p1: 'A'
},
pa: {
pb: {
p3: 'B'
}
},
p4: 'C'
}
// recursivly flatten object keys
const flatten = (obj, a=[]) => Object.entries(obj)
.reduce((r,[k,v]) => (typeof v == 'object' ? flatten(v,a) : r.push(k), r), a)
// search flattened objects
const searchKeys = (d, t) =>
d.filter(x => flatten(x).some(x => x.toLowerCase().includes(t.toLowerCase())))
// Break to array of objects
const arr = Object.entries(data).reduce((r,[k,v]) => (r.push({[k]:v}), r), [])
console.log(input.map(x => searchKeys(arr, x)))
答案 1 :(得分:2)
以下代码段可能会对您有所帮助:
const data = {
p1: {
name: 'test1',
value: 'value1'
},
p2: {
name: 'test2',
value: 'value2'
},
p3: {
name: 'test3',
value: 'value3'
}
}
const input = ['p1', 'p2']
console.log(input.map(key => data[key]))
这是按照您的期望进行操作的简单方法:
var data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}
var input=['p1','p2']
console.log(Object.keys(data).map(obj => {
return input.includes(obj) && data[obj]
}))
答案 2 :(得分:1)
您可以尝试
let input =['p1', 'p3'];
let data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}
let res = input.map(x => ({[x]:data[x]}))
console.log(res)
输出
(2) […]
0: Object { p1: {…} }
1: Object { p3: {…} }
答案 3 :(得分:1)
如果通过过滤器 object 表示您要的 object 包含输入数组中的键,则可以reduce
将输入数组{} :
var input = ['p1', 'p3'];
var data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}
var res = input.reduce((a, c) => {
a[c] = data[c];
return a;
}, {});
console.log(res);
答案 4 :(得分:0)
这是一种使用forEach
var input =['p1', 'p3'];
var data = {
p1: { name: 'test1', value:'value1'},
p2: { name : 'test2', value:'value2'},
p3: { name: 'test3', value: 'value3'}
}
input.forEach(filter => {
// Check if this key exists in data
if (data[filter]) {
console.log(data[filter])
}
})
答案 5 :(得分:0)
根据数组中存在的键过滤对象
var input =['p1', 'p3'];
var data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}
var filtered= Object.keys(data)
.filter( key => input.includes(key))
.reduce( (res, key) => Object.assign(res, { [key]: data[key] }), {} );
console.log(filtered);