Объединить 2 массива объектов на основе разных ключей, но с одинаковым значением - PullRequest
0 голосов
/ 04 июня 2019

Я сослался на вопросы, перечисленные ниже, но не получил ответ.

  1. Как можно динамически объединить свойства двух объектов JavaScript?
  2. объединить два объекта json на основе значения ключа в javascript
  3. объединить два массива объектов на основе ключа

У меня есть 2 массива объектов,

OBJ1 -

[
    {
        "ID": 58895,
        "step": "Outage Agreed w/ Business"
    },
    {
        "ID": 58896,
        "step": "GMLC/E911/CMAS Significant"
    }
]

OBJ2 -

[
    {
        "type": "verification_step",
        "value": "GMLC/E911/CMAS Significant"
    },
    {
        "type": "verification_step",
        "value": "Outage Agreed w/ Business"
    }
]

Я хочу получить вывод, который содержит оба значения в одном объекте на основе значениястрока то есть

[
    {
        "ID": 58896,
        "type": "verification_step",
        "step": "GMLC/E911/CMAS Significant"
    },
    {
        "ID": 58895,
        "type": "verification_step",
        "step": "Outage Agreed w/ Business"
    }
]

Пожалуйста, предложите мне выход.(Решение ES6 - высоко ценится)

Редактировать

Третья ссылка, которая была принята как дубликат, не является сценарием.Ключ должен оставаться «шагом», а данные должны быть объединены.

Ответы [ 5 ]

2 голосов
/ 04 июня 2019

Вы, вероятно, можете сделать это как один слой, но для удобства чтения и эффективности было бы лучше создать объект поиска на основе значения, которое вы хотите получить из одного из массивов, а затем map другой массив, используя поискприсоединиться к другому значению, которое вы хотите.Что-то вроде:

let arr1 = [{"ID": 58895,"step": "Outage Agreed w/ Business"},{"ID": 58896,"step": "GMLC/E911/CMAS Significant"}]
let arr2 = [{"type": "verification_step","value": "GMLC/E911/CMAS Significant"},{"type": "verification_step","value": "Outage Agreed w/ Business"}]

// lookup based on value
let lookup = arr2.reduce((m, {type, value}) => m.set(value, {type}), new Map)

// merge each item based on lookup
let result = arr1.map(item =>  Object.assign({}, item, lookup.get(item.step)))

console.log(result)
2 голосов
/ 04 июня 2019

Вы можете использовать reduce() после объединения обоих массивов.

const arr1 = [ { "ID": 58895, "step": "Outage Agreed w/ Business" }, { "ID": 58896, "step": "GMLC/E911/CMAS Significant" } ] 

const arr2 = [ { "type": "verification_step", "value": "GMLC/E911/CMAS Significant" }, { "type": "verification_step", "value": "Outage Agreed w/ Business" } ]

const res = [...arr1,...arr2.map(({value,...rest}) => ({step:value,...rest}))].reduce((ac,a) => {
  let k = a.step;
  ac[k] = {...ac[k],...a} || a;
  return ac;
},{})
console.log(Object.values(res))
0 голосов
/ 04 июня 2019

Вы можете взять Map для ID и получить это значение для отображения новых объектов.

var array1 = [{ ID: 58895, step: "Outage Agreed w/ Business" }, { ID: 58896, step: "GMLC/E911/CMAS Significant" }],
    array2 = [{ type: "verification_step", value: "GMLC/E911/CMAS Significant" }, { type: "verification_step", value: "Outage Agreed w/ Business" }],
    map = new Map(array1.map(({ ID, step }) => [step, ID])),
    result = array2.map(({ type, value: step }) => ({ ID: map.get(step), type, step }));

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

можно просто написать Вот ссылка для тестирования онлайн-компилятор es6

let arr = [];
 obj1.map((val, index) => {
  if(obj2[index]) {
   arr.push({ id: val.ID, type: obj2[index].type, value: obj2[index].value })
  }
});

console.log(arr);
0 голосов
/ 04 июня 2019

Поскольку вам нужен ES6, вы можете просто использовать оператор карты и объединить отсутствующее значение только с объектом.вот так

let obj=[
    {
        "type": "verification_step",
        "value": "GMLC/E911/CMAS Significant"
    },
    {
        "type": "verification_step",
        "value": "Outage Agreed w/ Business"
    }
]

const obj1=[
    {
        "ID": 58895,
        "step": "Outage Agreed w/ Business"
    },
    {
        "ID": 58896,
        "step": "GMLC/E911/CMAS Significant"
    }
]


obj.map((ob)=>{
    const found=obj1.find((e)=>{
        return e.step===ob.value;
    });
    if(found){
        ob.ID=found.ID
    }
});

Может быть опечатка, я просто набрал ее, но вы поняли идею.Вам необходимо выполнить необходимую проверку, чтобы избежать неопределенности.

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