使用数组输入过滤对象

时间:2018-11-17 05:08:39

标签: javascript ecmascript-6

我在JavaScript中有一个数组,例如

var input =['p1',  'p3'];

我的数据如下所示

var data = {p1: { name: 'test1', value:'value1'}, p2: { name : 'test2', value:'value2'}, p3: { name: 'test3', value: 'value3'}}

我需要根据输入数组过滤数据对象。是否有简单的ES6方法将其拉出。

Tia

6 个答案:

答案 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);