Как получить все объекты массива из массива - PullRequest
0 голосов
/ 06 июня 2018

Внутри объекта массива есть целевой массив:

[ 
  { 
    _id: 'main1',
    target: [
      { _id: '1', foo: [bar] },
      { _id: '2', foo: [bar] }
    ]
  },
  { 
    _id: 'main2',
    target: [
      { _id: '3', foo: [bar] },
      { _id: '4', foo: [bar] }
    ]
  }
]

Мне нужно получить все целевые объекты как один массив:

Необходимый результат

targets: [
  { _id: '1', foo: [bar] },
  { _id: '2', foo: [bar] }
  { _id: '3', foo: [bar] },
  { _id: '4', foo: [bar] }
]

Я пытался использовать map()

array.map(item => item.target)

Но это приводит к вложенному массиву, например: [ [ { _id: '1', foo: [bar] } ] ]

var array = [ 
      { 
        _id: 'main1',
        target: [
          { _id: '1', foo: ["bar"] },
          { _id: '2', foo: ["bar"] }
        ]
      },
      { 
        _id: 'main2',
        target: [
          { _id: '3', foo: ["bar"] },
          { _id: '4', foo: ["bar"] }
        ]
      }
    ]

console.log(
  array.map(item => item.target)
)

Ответы [ 6 ]

0 голосов
/ 06 июня 2018

var foo = [
  {
    "_id": "main1",
    "target": [
      {
        "_id": "1",
        "foo": "[bar]"
      },
      {
        "_id": "2",
        "foo": "[bar]"
      }
    ]
  },
  {
    "_id": "main2",
    "target": [
      {
        "_id": "3",
        "foo": "[bar]"
      },
      {
        "_id": "4",
        "foo": "[bar]"
      }
    ]
  }
]
var bar = [];
foo.map(function(val) {	
	bar = bar.concat(val.target);
})
console.log(bar)
0 голосов
/ 06 июня 2018

Вы можете использовать метод reduce ( Array.prototype.reduce )

Этот ответ проверяет свойство target перед объединением.

let targets = obj_arr.reduce((a,c)=>c.target&&a.concat(c.target),[]);

let obj_arr = [{
    _id: 'main1',
    target: [{
        _id: '1',
        foo: [""]
      },
      {
        _id: '2',
        foo: [""]
      }
    ]
  },
  {
    _id: 'main2',
    target: [{
        _id: '3',
        foo: [""]
      },
      {
        _id: '4',
        foo: [""]
      }
    ]
  }
]

let targets = obj_arr.reduce((accumulator, current_value) =>
      current_value.target&&accumulator.concat(current_value.target), []);


console.log(targets);
0 голосов
/ 06 июня 2018

var array = [
      {
        _id: 'main1',
        target: [
          { _id: '1', foo: ["bar"] },
          { _id: '2', foo: ["bar"] }
        ]
      },
      {
        _id: 'main2',
        target: [
          { _id: '3', foo: ["bar"] },
          { _id: '4', foo: ["bar"] }
        ]
      }
    ] ;

  var result=[];
  for(var key in array){
  	 target=array[key].target;
  	 for(var kt in target){
  	 	 result.push(target[kt]);
  	 }
  }

  console.log(result);
0 голосов
/ 06 июня 2018

Вы можете использовать reduce().Он проходит через массив (аналогично map()), но создает новый результат по ходу.

array.reduce((result, current) => {
    result = [...result, ...current.target]
    return result;
}, []);

Или, если вы не можете использовать спреды , вы можете использовать concat()вместо:

array.reduce((result, current) => {
    result = result.concat(current.target);
    return result;
}, []);
0 голосов
/ 06 июня 2018

var arr = [ 
  { 
    _id: 'main1',
    target: [
      { _id: '1', foo: ["bar"] },
      { _id: '2', foo: ["bar"] }
    ]
  },
  { 
    _id: 'main2',
    target: [
      { _id: '3', foo: ["bar"] },
      { _id: '4', foo: ["bar"] }
    ]
  }
]
var result =  arr.reduce((a,o) => a.concat(o.target), []);
console.log(result);
0 голосов
/ 06 июня 2018

Вы можете использовать concat для объединения массивов.Используйте оператор распространения и map для циклического перемещения по массиву.

let arr = [{_id:'main1',target:[{_id:'1',foo:['bar']},{_id:'2',foo:['bar']}]},{_id:'main2',target:[{_id:'3',foo:['bar']},{_id:'4',foo:['bar']}]}];
let result = [].concat(...arr.map(o => o.target));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...