JavaScript从键值对对象创建单个对象

时间:2018-03-17 14:36:10

标签: javascript arrays loops object lodash

JavaScript从键值对对象创建单个对象。

嗨,朋友我有几个对象,我想创建另一个具有partucular arr(const props = [])的键,以及来自这些对象的值 - 如果它只存在于那些对象中,但如果不存在 - 我想推出null或其他一些虚假的值。 对不起我的英语。



const props = ["name", "price", "qty", "category"]
let len = props.length;

const obj_1 = {
  name: "Product_1",
  price: 120,
  category: 'phone'
}

const obj_2 = {
  name: "Product_2",
  price: 7893,
  category: 'program_eq',
  qty: 5
}

const final_obj = {
  name: ["Product_1", "Product_2"],
  price: [120, 7893],
  category: ["phone", "program_eq"],
  qty: [null, 5]
}




我花了很多时间来解决这个问题,并且有一些解决方案 - 但它只给我第一个对象。 我正在使用lodash / map它可以帮助我使用不同类型的集合。 你可以看到我愚蠢的solutuin吼叫......



const final_obj = {};
    const props = ["name", "price", "qty", "category"];
    let len = props.length;

    const obj = {
      c1s6c156a1cascascas: {
        item: {
          name: "Product_1",
          price: 120,
          category: "phone"
        }
      },
      c454asc5515as41cas78: {
        item: {
          name: "Product_2",
          price: 7893,
          category: "program_eq",
          qty: 5
        }
      }
    };

    _.map(obj, (element, key) => {
      console.log(element.item);
      while (len) {
        let temp = props.shift();
        let tempData = [];
        if (element.item.hasOwnProperty([temp])) {
          tempData.push(element.item[temp]);
        } else {
          tempData.push("---");
        }
        final_obj[temp] = tempData;
        len--;
      }
    });
    console.log(final_obj); 
    
    //
    category:["phone"]
    name:["Product_1"],
    price:[120],
    qty:["---"],




3 个答案:

答案 0 :(得分:1)

您可以使用reduce()方法执行此操作,该方法将返回对象并在内部使用forEach()循环。

const props = ["name", "price", "qty", "category"];
const obj = {"c1s6c156a1cascascas":{"item":{"name":"Product_1","price":120,"category":"phone"}},"c454asc5515as41cas78":{"item":{"name":"Product_2","price":7893,"category":"program_eq","qty":5}}}

const result = Object.values(obj).reduce((r, e) => {
  props.forEach(prop => {
    if(!r[prop]) r[prop] = []
    r[prop].push(e.item[prop] || null)
  })
  return r;
}, {})

console.log(result)

答案 1 :(得分:1)

我将如何处理它:

const final_obj = { };
const props = ["name", "price", "qty", "category"];
const obj = {"c1s6c156a1cascascas":{"item":{"name":"Product_1","price":120,"category":"phone"}},"c454asc5515as41cas78":{"item":{"name":"Product_2","price":7893,"category":"program_eq","qty":5}}}

// set up each property as an empty array in the object
props.forEach(item => {
    final_obj[item] = [];
});

// this iterates over every property in the object
_.forOwn(obj, value => {
    props.forEach(item => {
        // just push the values undefined or no into each property array
        final_obj[item].push(value.item[item]);
    });
});
console.log(final_obj);

答案 2 :(得分:0)

你也可以使用一些lodash函数。

将道具数组转换为一个对象,其中键是道具的值,以及从对象中提取的值。如果对象中不存在该属性,则返回null。

const getValFromObj = (obj, key) => _.map(obj, _.partial(_.get, _, key, null));
const setValInResult = (res, key) => _.set(res, key, getValFromObj(obj, 'item.' + key));
const groupByProps = (props, obj) => _.transform(props, setValInResult, {});

const props = ["name", "price", "qty", "category"];
const obj = {
  "c1s6c156a1cascascas": {
    "item": {
      "name": "Product_1",
      "price": 120,
      "category": "phone"
    }
  },
  "c454asc5515as41cas78": {
    "item": {
      "name": "Product_2",
      "price": 7893,
      "category": "program_eq",
      "qty": 5
    }
  }
}

console.log(groupByProps(props, obj));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>