【问题标题】:How to loop over an array and create a new json object using its data based on some keys如何循环数组并使用基于某些键的数据创建新的 json 对象
【发布时间】:2018-06-28 10:36:20
【问题描述】:

我有一个数组中的对象列表,

[
  { "long_name": "1144", "short_name": "1144", "types": ["street_address"] },
  { "long_name": "New York", "short_name": "New York", "types": ["city"] },
  { "long_name": "New York County", "short_name": "New York County", "types": ["admin_area", "portal"] },
  { "long_name": "New York", "short_name": "NY", "types": ["state"] },
  { "long_name": "United States", "short_name": "US", "types": ["country"] }
]

我想要做的是创建一个新对象,但具有不同的键名。例如,第一个对象“1144”将变成类似

{
  "street_short": 1144,
  "street_long": 1144,
  ...

  // second object will become like
  "city_short": "New York",
  "city_long": "New York",
}

这应该根据对象的类型来完成。如上例,类型是“street_address”,所以新的json变成了“street_short”和“street_long”。基本上应该根据类型是什么。

我尝试用 Lodash 做,但没有成功:

var getAddressFromGooglePlace = function(address) {
  let newObj = {};
  if (!address) {
    return;
  }
  if (!address.address_components || !address.address_components.length) {
    return;
  }

  let findInArray = function(array, keyword) {
    return _.find(array, word => {
      return _.find(word.types, type => {
        if (type == keyword) return true;
      });
    });
  };

  let components = address.address_components;

  components.forEach(element => {
    if (findInArray(components, "street_number")) {
      newObj.plot_short = element.short_name;
      newObj.plot_long = element.long_name;
    }
  });

  return address;
}

谢谢!

【问题讨论】:

  • 请分享您的 lodash 代码尝试。
  • “基本上应该根据类型是什么。”请多加一些例子。
  • 第一个和address 部分会发生什么?如果类型多于一种,应该怎么办?
  • 你应该循环数组,使用for(var i=0,individualObject,l=yourArray.length; i<l; i++){ individualObject = yourArray[i]; }之类的东西,然后测试属性值并使用赋值来创建其他东西。

标签: javascript arrays angularjs object


【解决方案1】:

我已经循环输入然后继续循环types 因为types 是数组,然后构建新对象

var input = [
  { "long_name": "1144", "short_name": "1144", "types": ["street_address"] },
  { "long_name": "New York", "short_name": "New York", "types": ["city"] },
  { "long_name": "New York County", "short_name": "New York County", "types": ["admin_area", "portal"] },
  { "long_name": "New York", "short_name": "NY", "types": ["state"] },
  { "long_name": "United States", "short_name": "US", "types": ["country"] }
];

var newObj = {};

_.each(input, (o) => {
    _.each(o.types, (type) => {
	_.mapKeys(o, (value, key) => {
	    if (key !== "types") {
		_.assign(newObj, {[type.split("_")[0] + "_" + key.split("_")[0]]: value});
	    }
        });
    });
});

console.log(newObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    您可以使用一个对象并分配长属性和短属性。

    var array = [{ long_name: "1144", short_name: "1144", types: ["street_address"] }, { long_name: "New York", short_name: "New York", types: ["city"] }, { long_name: "New York County", short_name: "New York County", types: ["admin_area", "portal"] }, { long_name: "New York", short_name: "NY", types: ["state"] }, { long_name: "United States", short_name: "US", types: ["country"] }],
        object = Object.assign(...array.map(o =>
            Object.assign(...['long', 'short'].map(k => 
                ({ [k + '_' + o.types[0]]: o[k + '_name'] })))));
        
    console.log(object);

    【讨论】:

    • 我不明白一件事。为什么是 CSS?
    【解决方案3】:

    我认为您想以编程方式循环遍历您的键并将它们插入到一个新对象中。希望这段代码 sn-p 会有所帮助,尽管您必须考虑在 types 数组中包含多个项目。

    var array = [
      { "long_name": "1144", "short_name": "1144", "types": ["street_address"] },
      { "long_name": "New York", "short_name": "New York", "types": ["city"] },
      { "long_name": "New York County", "short_name": "New York County", "types": ["admin_area", "portal"] },
      { "long_name": "New York", "short_name": "NY", "types": ["state"] },
      { "long_name": "United States", "short_name": "US", "types": ["country"] }
    ];
    var newObj = {};
    
    array.forEach((obj) => {
      for (var key in obj) {
        if (key === 'types') return;
        var type = obj.types[0];
        var lengthType = key.split('_')[0];
        var newKey = `${type}_${lengthType}`;
    
        newObj[newKey] = obj[key];
      }
    });
    console.log(newObj);

    【讨论】:

      【解决方案4】:

      如果要重命名键,映射到当前数组,并为每个对象输出一个带有自定义命名键的新对象:

      let input =[
        { "long_name": "1144", "short_name": "1144", "types": ["street_address"] },
        { "long_name": "New York", "short_name": "New York", "types": ["city"] },
        { "long_name": "New York County", "short_name": "New York County", "types": ["admin_area", "portal"] },
        { "long_name": "New York", "short_name": "NY", "types": ["state"] },
        { "long_name": "United States", "short_name": "US", "types": ["country"] }
      ]
      
      let output = input.map( obj => {
      	return {
      		  street_short : obj.long_name,
        		street_long  : obj.short_name,
      	}
      })
      
      console.log(output)

      【讨论】:

      • 是的,一个无声的反对票!谢谢,已经很久了。很有建设性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多