在不复制的情况下拆分数组对象

Split an array-object without replication

我正在学习如何处理 js 数组,我想知道是否可以通过拆分现有对象的属性来创建新的数组对象。

我尝试使用 .map 和 .flatMap 来做到这一点,但输出为我提供了复制其他值的对象组合,而我正在寻找独特的对象

我认为代码可以更清晰:

const array=[ 
    { names:['something1', 'something2'],
      state:false,
      features:['feature1','feature2']
    },
    { names:['something3', 'something4'],
      state:true,
      features:['feature3','feature4']
    },
  ]

  array.flatMap(({names,state,features}) => {
    names.flatMap(name => {
      features.flatMap(feature => {
        console.log(({name,state,feature}));
      })
    })
  })

因此,使用此代码的输出是:

{ name: 'something1', state: false, feature: 'feature1' }
{ name: 'something1', state: false, feature: 'feature2' }
{ name: 'something2', state: false, feature: 'feature1' }
{ name: 'something2', state: false, feature: 'feature2' }
{ name: 'something3', state: true, feature: 'feature3' }
{ name: 'something3', state: true, feature: 'feature4' }
{ name: 'something4', state: true, feature: 'feature3' }
{ name: 'something4', state: true, feature: 'feature4' }

但我希望输出为:

{ name: 'something1', state: false, feature: 'feature1' },
{ name: 'something2', state: false, feature: 'feature2' },
{ name: 'something3', state: true, feature: 'feature3' },
{ name: 'something4', state: true, feature: 'feature4' }

我是编码新手,如果我的话在描述这个问题时不正确,请原谅。 感谢您的耐心等待

给你,对最后一个稍作修改。只是地图名称。

const arr = [{
  names: ["test1", "test2"],
  values: ["t1", "t2"]
},
{
  names: ["test3", "test4"],
  values: ["t3", "t4"]
}];

const flat = arr.reduce((a, {names, values}) => {
   names.map((name, i) => {   
     a.push({ name, value: values[i]});
  });
  return a;
}, []).flat();

console.log(`Flat: ${JSON.stringify(flat)}`);

您可以使用 .flatMap() 和内部 .map() 函数(而不是像您正在做的 .flatMap() )将 names 数组中的每个元素映射到它的拥有各自的对象及其关联 feature.

参见下面的示例:

const array = [{
    names: ['something1', 'something2'],
    state: false,
    features: ['feature1', 'feature2']
  },
  {
    names: ['something3', 'something4'],
    state: true,
    features: ['feature3', 'feature4']
  },
];

const res = array.flatMap(
  ({names, state, features}) => names.map((name, i) => ({name, state, feature: features[i]}))
);
console.log(res);

如果你想学习编程,魔法可能不是最好的选择。 map(), reduce() 之类的本身就是算法。基础知识是用简单的循环(forwhile)和有时递归(就像这个问题起源的一般解决方案)来完成这些任务。

你现在拥有的是一个数组,你可以在 outer 循环中对其进行迭代,并且内部有具有并行数组的对象,你也可以在 [=16] 中对其进行迭代=]循环:

const array=[ 
    { names:['something1', 'something2'],
      state:false,
      features:['feature1','feature2']
    },
    { names:['something3', 'something4'],
      state:true,
      features:['feature3','feature4']
    },
  ];
  
for(let outer=0;outer<array.length;outer++){
  let obj=array[outer];
  for(let inner=0;inner<obj.names.length;inner++)
    console.log({
      name:obj.names[inner],
      state:obj.state,
      feature:obj.features[inner]
    });
}

那么是的,外循环根本不需要索引,所以它可以直接遍历元素(for(let obj of array)array.forEach()),但是对于inner循环你需要索引,所以把它扔掉并不是那么简单(请参阅建议的 map() 变体的奇怪不平衡:它们有 name,和 features[i] - 当然 name 实际上已经 names[i] 提取出来了,但它隐藏了两个数组并行遍历的事实)。