创建对象的重复数组

时间:2021-01-19 07:59:09

标签: javascript node.js

假设我有一个对象数组::

const banana = [{"a":"ann","b":"bann","det":[{"c":"cat","d":"dog"},{"c":"conn","d":"donn"}]}, {"a":"auu","b":"buu","det":[{"c":"camel","d":"damel"},{"c":"coww","d":"doww"}]}]

我想以这种形式转换这个对象数组::

const banana =  [{"a":"ann","b":"bann","c":"cat","d":"dog"}, {"a":"ann","b":"bann","c":"conn","d":"donn"}, {"a":"auu","b":"buu","c":"camel","d":"damel"}, {"a":"auu","b":"buu","c":"coww","d":"doww"}]

如您所见,对象数组中的对象数组已合并和复制。

我试过:

const apple = []

for(let i = 0; i<banana.length;i++){
    for(let j = 0;j<banana[i].det.length;j++{
    apple.push(banana[i].det[j])
    }
}
console.log(apple)

**OUTPUT: [{c: "cat", d: "dog"},{c: "conn", d: "donn"},{c: "camel", d: "damel"},{c: "coww", d: "doww"}]**

但我正在寻找 O/P 为:

[{"a":"ann","b":"bann","c":"cat","d":"dog"}, {"a":"ann","b":"bann","c":"conn","d":"donn"}, 
{"a":"auu","b":"buu","c":"camel","d":"damel"}, {"a":"auu","b":"buu","c":"coww","d":"doww"}]

但我无法形成逻辑。我仍在尝试,但如果我能得到一些真正有用的指导。

**编辑:**所以我想出了一个使用扩展运算符的想法:

let enamel = {}

for(let i = 0; i<banana.length;i++){
    for(let j = 0;j<banana[i].det.length;j++){
     employee = {
        ...banana[j],
        ...banana[i].det[j]
    };
    }
}

它给出的输出为:

console.log(enamel) 
{a: "auu", b: "buu", det: Array(2), c: "coww", d: "doww"}

但我想将所有对象都放在一个数组中,如前所述。

5 个答案:

答案 0 :(得分:1)

你可以使用这个逻辑,它复制初始对象,添加额外的属性,删除 det 数组,并将结果展平 ?

function extras(obj) {
  // create a copy of the current context (initial obj)
  // and add all properties from the extra object
  obj = Object.assign({}, this, obj);
  // but delete the `det` from the copy
  delete obj.det;
  // and return the object
  return obj;
}

// per each array object ...
banana
  .map(
    // and per each det ...
    obj => obj.det.map(extras, obj)
  )
  // flatten the final array of objects
  .flat();

答案 1 :(得分:0)

你可以这样做:

const banana = [
        { 
            "a": "ann", 
            "b": "bann",
            "det": [{ "c": "cat", "d": "dog" }, { "c": "conn", "d": "donn" }]
        }, 

        { 
            "a": "auu", 
            "b": "buu", 
            "det": [
                { "c": "camel", "d": "damel" },
                { "c": "coww", "d": "doww" }
            ] 
        }
    ]

    const result = [];
    banana.forEach( b =>{
        b.det.forEach(d =>{
            result.push({
                a: b.a,
                b: b.b,
                c: d.c,
                d: d.d
            });
        });
    });

    console.log(result);

答案 2 :(得分:0)

您只需要从 a 中的对象中提取 bbanana。我已经使用解构来提取它。

const banana = [{ "a": "ann", "b": "bann", "det": [{ "c": "cat", "d": "dog" }, { "c": "conn", "d": "donn" }] }, { "a": "auu", "b": "buu", "det": [{ "c": "camel", "d": "damel" }, { "c": "coww", "d": "doww" }] }]
const apple = []

for (let i = 0; i < banana.length; i++) {
  for (let j = 0; j < banana[i].det.length; j++) {
      const {a,b} = banana[i];
      const {c,d} = banana[i].det[j];
      apple.push({a,b,c,d});
    }
}
console.log(apple)

答案 3 :(得分:0)

试试这个

const banana = [{"a":"ann","b":"bann","det":[{"c":"cat","d":"dog"},{"c":"conn","d":"donn"}]}, {"a":"auu","b":"buu","det":[{"c":"camel","d":"damel"},{"c":"coww","d":"doww"}]}]

const output = []

for (const { a, b, det } of banana) {
  for (const animal of det) {
    output.push({a, b, ...animal })
  }
}

console.log(output)

答案 4 :(得分:0)

我认为您想这样做,以防您想避免手动获取 a 和 b 以及除“det”属性之外的其他属性

function getResult(banana) {

    const answer = [];

    banana.forEach(element => {
        const arrayData = element['det'];
        delete element['det'];
        // remove the 'del' property temporarily

        arrayData.forEach(subElement  => {
            answer.push({
                ...element, // basically spread operator to make copy of all properties each time
                ...subElement
            });
        });

        // restore the 'del' proprty
        element['det'] = arrayData;
    });

    console.log("the result is : ", answer);
    return answer;
}
相关问题