js根据结果改变原数组,组成新数据?

初始值:
[ {label: '1', value: '11'}, 
  {label: '2', value: '11'}, 
  {label: '3', value: '11'}, 
  {label: '4', value: '11'}, 
  {label: '5', value: '11'}, 
  {label: '6', value: '11'}
]


结果:
[ {label: '1', value: '13'}, 
  {label: '3', value: '11'}, 
  {label: '5', value: '13'}, 
  {label: '6', value: '13'}, 
]

组装新数据:
[ {label: '1', value: '13'}, 
  {label: '2', value: '11'}, 
  {label: '3', value: '11'}, 
  {label: '4', value: '11'}, 
  {label: '5', value: '13'}, 
  {label: '6', value: '13'}
]
阅读 2.6k
6 个回答

其实不采用find也可以,直接改原数组,两个for循环即可解决

const merge = (base, actual) => {
  const init = [...base];
  if (!actual?.length) return init;
  init.forEach((item, index) => {
    actual.forEach((record) => {
      if (item.label === record.label) init[index] = record;
    });
  });
  return init;
};

这应该是最简单的解决方法

var arr1 = 
[ {label: '1', value: '11'}, 
  {label: '2', value: '11'}, 
  {label: '3', value: '11'}, 
  {label: '4', value: '11'}, 
  {label: '5', value: '11'}, 
  {label: '6', value: '11'}
]


var arr2=
[ {label: '1', value: '13'}, 
  {label: '3', value: '11'}, 
  {label: '5', value: '13'}, 
  {label: '6', value: '13'}, 
]

var obj = arr2.reduce((res,{label, value}) => (res[label] = value,res),{})
arr1.forEach(v => v.label in obj && (v.value = obj[v.label]))
 let arr1 = [ 
                {label: '1', value: '11'}, 
                {label: '2', value: '11'}, 
                {label: '3', value: '11'}, 
                {label: '4', value: '11'}, 
                {label: '5', value: '11'}, 
                {label: '6', value: '11'}
               ]
    let arr2 = [ 
                {label: '1', value: '13'}, 
                {label: '3', value: '11'}, 
                {label: '5', value: '13'}, 
                {label: '6', value: '13'}, 
               ]
    let arr3 = arr1.map(item => arr2.find(it=> it.label == item.label) || item)

这是我之前问的,有个大佬给我的回答,正好也可以用在你这上面

这样?

Object.values(Object.fromEntries([初始值, 结果].flatMap(i => i.map(j => [j.label, j]))))

其实一般来说都会使用 循环+找到匹配值的形式,比如说 forEach + find 或者 map + find 也就是这样写:

var sourceData = []
var newResult = []

newResult.forEach(newData => {
  const oldData = sourceData.find(item=>item.label === newData.label)
  oldData.value = newData.value
})
console.log(sourceData)
// (6) [{…}, {…}, {…}, {…}, {…}, {…}]
//  0: {label: '1', value: '13'}
//  1: {label: '2', value: '11'}
//  2: {label: '3', value: '11'}
//  3: {label: '4', value: '11'}
//  4: {label: '5', value: '13'}
//  5: {label: '6', value: '13'}
//  length: 6

我就不用解构赋值什么了,简写的方法你可以看楼上的。

基本思路,遍历原数组,拿每一个 label 去结果数组里找,找到了就更新 value

题上要求改变原数组,所以我的做法不会产生新数组,只会更新 value

const data = [
    { label: "1", value: "11" },
    { label: "2", value: "11" },
    { label: "3", value: "11" },
    { label: "4", value: "11" },
    { label: "5", value: "11" },
    { label: "6", value: "11" }
];

const update = [
    { label: "1", value: "13" },
    { label: "3", value: "11" },
    { label: "5", value: "13" },
    { label: "6", value: "13" },
];

data.forEach(it => {
    it.value = update.find(u => u.label === it.label)?.value ?? it.value;
});

如果 update 比较小的话,用 find 查找问题不大。但是如果数据比较多,最好还是先作个映射表(字典),其实这种方法看起来似乎还更好懂一些

const dict = Object.fromEntries(update.map(({ label, value }) => [label, value]));
data.forEach(it => it.value = dict[it.label] ?? it.value);

反过来查找也是一样的:

反过来处理更需要理解对象引用的概念。思路是遍历结果数组,拿每一个 label 去原数组里找对象,找到了就给的更新 value。
update.forEach(({ label, value }) => {
    // 由于 ?.value = value 是语法错误,所以给个空对象来处理没找到的情况,
    // 反正都是丢掉
    (data.find(it => it.label === label) ?? {}).value = value;
});

而且反过来也可以做映射表

// 这里用的 Map,直接用 Object.fromEntries 产生对象也类似
const dict = new Map(data.map(it => [it.label, it]));
update.forEach(({ label, value }) => {
    (dict.get(label) ?? {}).value = value;
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏