如何从数组中选择数据并从中创建单个Object?

Eth*_*alm 0 javascript ecmascript-6

我想从一个对象数组中创建一个对象.请参阅提供的代码.

这是输入数组

let queryArr = [
  {
    query: {
        filter: {
          term: {
            search: 'complete',
          }
        }
    }
  },
  {
    query: {
        notFilter: {
          term: {
            search: 'failed',
          }
        }
    }
  },
  {
    query: {
      bool: {
          term: {
            search: 'complete',
          }
      }
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

预期的产出

let oneQuery = {query: {
      bool: { ... },
      filter: { ... },
      notFilter: { ... } // data from respective array object key
    }};
Run Code Online (Sandbox Code Playgroud)

我写的功能

function createQuery(arr){
  for(let i = 0; i < arr.length; i++){
    if(Object.keys(arr[i].query === 'bool')){
       oneQuery.query.bool = arr[i].query.bool;
    }
    if(Object.keys(arr[i].query === 'filter')){
       oneQuery.query.filter = arr[i].query.filter;
    }
    if(Object.keys(arr[i].query === 'notFilter')){
       oneQuery.query.notFilter = arr[i].query.notFilter;
    }
  }
  return oneQuery;
}
createQuery(queryArr);
Run Code Online (Sandbox Code Playgroud)

我得到的输出:

query: {
   bool: { ... },
   filter: undefined,
   notFilter: undefined
}
Run Code Online (Sandbox Code Playgroud)

我不知道我在这里做错了什么.使用reduce或map的解决方案将是优选的.

Ori*_*ori 5

使用Array.map()来获得与每一个内容的数组query属性,然后蔓延Object.assign()合并到单个对象:

const queryArr = [{"query":{"filter":{"term":{"search":"complete"}}}},{"query":{"notFilter":{"term":{"search":"failed"}}}},{"query":{"bool":{"term":{"search":"complete"}}}}];

const createQuery = (arr) => ({ 
  query: Object.assign({}, ...queryArr.map(({ query }) => query)) 
});

console.log(createQuery(queryArr));
Run Code Online (Sandbox Code Playgroud)

要修复代码,请初始化查询项,并从数组中的每个项中获取第一个键 - arr[i].query)[0]:

const queryArr = [{"query":{"filter":{"term":{"search":"complete"}}}},{"query":{"notFilter":{"term":{"search":"failed"}}}},{"query":{"bool":{"term":{"search":"complete"}}}}]


function createQuery(arr){
  const oneQuery = { query: {} };

  for(let i = 0; i < arr.length; i++){
    if(Object.keys(arr[i].query)[0] === 'bool'){
       oneQuery.query.bool = arr[i].query.bool;
    }
    if(Object.keys(arr[i].query)[0] === 'filter'){
       oneQuery.query.filter = arr[i].query.filter;
    }
    if(Object.keys(arr[i].query)[0] === 'notFilter'){
       oneQuery.query.notFilter = arr[i].query.notFilter;
    }
  }
  return oneQuery;
}
console.log(createQuery(queryArr));
Run Code Online (Sandbox Code Playgroud)