Javascript связывает объекты в один массив - PullRequest
0 голосов
/ 12 ноября 2018

Может кто-нибудь, пожалуйста, помогите мне с некоторым кодом о том, как превратить массив объектов в один массив, так как у меня есть setInterval, который вызывает API каждые 2 минуты и передает результат в переменную prod, теперь переменная сталамассив объектов, я просто хочу сделать его одним массивом.Вот как сейчас выглядит prod

var prod = [
    [{
        "order_id": "283828",
        "product_id": "126354",
        "order_qty": "1",
        "customer_note": "",
        "out_of_stock": "pick_specific_replacement",
        "status": "0",
        "id": "317",
        "price": "98.99"
    }],
    [{
        "order_id": "283828",
        "product_id": "126354",
        "order_qty": "1",
        "customer_note": "",
        "out_of_stock": "pick_specific_replacement",
        "status": "0",
        "id": "317",
        "price": "98.99"
    }]
]

Я хочу превратить его в

var prod = [
    {
        "order_id": "283828",
        "product_id": "126354",
        "order_qty": "1",
        "customer_note": "",
        "out_of_stock": "pick_specific_replacement",
        "status": "0",
        "id": "317",
        "price": "98.99"
    },
    {
        "order_id": "283828",
        "product_id": "126354",
        "order_qty": "1",
        "customer_note": "",
        "out_of_stock": "pick_specific_replacement",
        "status": "0",
        "id": "317",
        "price": "98.99"
    }
]

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

Вот несколько различных способов добиться этого:

Использование Array.prototype.reduce :

const data = [[{a: 1}],[{b: 2}]];
const result = data.reduce((r,c) => [...r, ...c])
console.log(result)

Использование Array.prototype.reduce & Array.prototype.concat :

const data = [[{a: 1}],[{b: 2}]];
const result = data.reduce((r,c) => r.concat(c))
console.log(result)

Использование только Array.prototype.concat с синтаксисом ES6 :

const data = [[{a: 1}],[{b: 2}]];
const result = [].concat(...data)
console.log(result)

Использование рекурсии с Array.prototype.reduce для рекурсивного сглаживания вместо одного уровня:

const data = [[{a: 1}],[{b: 2}], [[{c: 1}]], [[[{d: 1}]]]];
const flattenDeep = (arr, accumulator = []) =>
   arr.reduce((r,c) => 
   (Array.isArray(c) ? flattenDeep(c, r) : r.push(c), r), accumulator)

console.log(flattenDeep(data))

Использование lodash flatten & flattenDeep :

const data = [[{a: 1}],[{b: 2}]];
console.log('flatten: ', _.flatten(data))

const data2 = [[{a: 1}],[{b: 2}], [[{c: 1}]], [[[{d: 1}]]]];
console.log('flattenDeep: ', _.flattenDeep(data2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 12 ноября 2018

Вместо нажатия на массив для каждого вызова API, объедините результат с массивом;

prod.push(response);

Превратится в:

prod = prod.concat(response);
0 голосов
/ 12 ноября 2018

Это должно работать:

prod = prod.map(a => a[0]);

Но вместо исправления результата следует избегать корня проблемы.Я предполагаю, что где-то в вашем коде у вас есть что-то вроде prod.push(something).Это должно быть изменено на prod.push(something[0]).Чтобы быть уверенным, вам нужно поделиться кодом, который передает массив prod.

0 голосов
/ 12 ноября 2018

Вы можете использовать .concat() с синтаксисом распространения:

let data = [
    [{"order_id": "283828", "product_id": "126354", "order_qty": "1", "customer_note": "", "out_of_stock": "pick_specific_replacement", "status": "0", "id": "317", "price": "98.99"}],
    [{"order_id": "283828", "product_id": "126354", "order_qty": "1", "customer_note": "", "out_of_stock": "pick_specific_replacement", "status": "0", "id": "317", "price": "98.99"}]
];

let result = [].concat(...data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...