создать объект массива, добавив значение ключа на основе соответствующего ключа в javascript - PullRequest
0 голосов
/ 19 июня 2020

Как создать новый массив объектов, добавив свойство в jvascript

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

if obj2 и obj1 значение ключа code соответствует, затем добавьте ключ sid со значением id

function arr(obj1, obj2){
   return obj1.filter(({ code }) =>
      obj2.find((obj) => Object.values(obj).includes(code ))
    );
}
var obj1 = [ 
 { id:1, code:"item1", color:"blue" },
 { id:2, code:"item2", color: "white" },
 { id:3, code:"item3", color: "brown" }
]

var obj2 = [
 { id:1, code:"item1", stock: 10 },
 { id:3, code:"item1", stock: 20 },
 { id:2, code:"item2", stock: 20 }
]

Ожидаемый результат:

[ 
 { id:1, code:"item1", color:"blue", sid: 1,3 },
 { id:2, code:"item2", color: "white", sid: 2 }
]

Ответы [ 3 ]

0 голосов
/ 19 июня 2020

Вы можете взять таблицу ha sh и отобразить новый массив.

var array1 = [{ id: 1, code: "item1", color: "blue" }, { id: 2, code: "item2", color: "white" }, { id: 3, code: "item3", color: "brown" }],
    array2 = [{ id: 1, code: "item1", stock: 10 }, { id: 3, code: "item1", stock: 20 }, { id: 2, code: "item2", stock: 20 }],
    map = array2.reduce((r, { id, code }) => {
        (r[code] = r[code] || []).push(id);
        return r;
    }, {}),
    result = array1.reduce((r, o) => {
        if (map[o.code]) r.push({ ...o, sid: map[o.code].join() });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 19 июня 2020

Вам может понадобиться reduce здесь:

var obj1=[ { id:1, code:"item1", color:"blue" }, { id:2, code:"item2", color: "white" }, { id:3, code:"item2", color: "brown" }];

var obj2=[ { id:1, code:"item1", stock: 10 }, { id:3, code:"item1", stock: 20 }, { id:2, code:"item2", stock: 20 }]

var result = Object.values([...obj1,...obj2].reduce((acc, {code, color, id, ...rest})=>{
    acc[code] = acc[code] || {code, id, color, sid:[]};
    if(rest.stock) acc[code].sid.push(id);
    return acc;
},{})).map(({sid,...rest})=>({...rest, sid:sid.join(',')}));

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

Вот одно возможное решение:

var obj1 = [ 
 { id:1, code:"item1", color:"blue" },
 { id:2, code:"item2", color: "white" },
 { id:3, code:"item3", color: "brown" }
]

var obj2 = [
 { id:1, code:"item1", stock: 10 },
 { id:3, code:"item1", stock: 20 },
 { id:2, code:"item2", stock: 20 }
]

var reduced = obj1.reduce((obj, next) => {
  var { id, code, color } = next;
  var key = id + code;
  obj[key] = { id, code, color, sid: [] };
  return obj;
}, {});

obj2.forEach(obj => {
  var { id, code, stock } = obj;
  var key = id + code;
  var object = reduced[key];
  if (object)
    object.sid.push(stock);
});

var output = Object.values(reduced);
console.log(output);

, которое дает:

[
  { id: 1, code: 'item1', color: 'blue', sid: [ 10 ] },
  { id: 2, code: 'item2', color: 'white', sid: [ 20 ] },
  { id: 3, code: 'item3', color: 'brown', sid: [] }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...