Объедините значение объекта JSON в массив, дублируя ключ и значение [javascript] - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу объединить некоторый объект значения с тем же ключом и значением, в этом случае "field_template_id": 2 является дубликатом, но имеют другое значение.

json data:

{
  "id": "c2dec94f",
  "data": [
    {
      "field_template_id": 1,
      "value": "111"
    },
    {
      "field_template_id": 2,
      "value": 222
    },
    {
      "field_template_id": 2,
      "value": 444
    },
    {
      "field_template_id": 3,
      "value": [
        333
      ]
    }
  ]
}

я ожидалбыть таким, там все еще "field_template_id": 2, но значение - массив.

ожидаемый json:

{
  "id": "c2dec94f",
  "data": [
    {
      "field_template_id": 1,
      "value": "111"
    },
    {
      "field_template_id": 2,
      "value": [
        222, 444
      ]
    },
    {
      "field_template_id": 3,
      "value": [
        333
      ]
    }
  ]
}

Заранее спасибо

1 Ответ

0 голосов
/ 05 декабря 2018

const json = {
    "id": "c2dec94f",
    "data": [
        {
            "field_template_id": 1,
            "value": "111"
        },
        {
            "field_template_id": 2,
            "value": 222
        },
        {
            "field_template_id": 3,
            "value": [
                333
            ]
        },
        {
            "field_template_id": 2,
            "value": 444
        }
    ]
}
const data = json.data

let obj = {}
let arr = []
data.forEach(item => {
    if (obj[item.field_template_id]) {
        arr.some((val, key) => {
            const newItem = arr[key]
            if (val.field_template_id === item.field_template_id) {
                if (Array.isArray(newItem.value) && Array.isArray(item.value)) {
                    newItem.value = newItem.value.concat(item.value)
                } else if (Array.isArray(newItem.value)) {
                    newItem.value.push(item.value)
                } else if (Array.isArray(item.value)) {
                    item.value.unshift(newItem.value)
                } else {
                    const result = []
                    result.push(newItem.value)
                    result.push(item.value)
                    newItem.value = result
                }
                return true
            } else {
                return false
            }
        })
    } else {
        obj[item.field_template_id] = true
        arr.push(item)
    }
})

const result = {
    id: json.id,
    data: arr
}

console.log(result)
...