使用包含数组的对象过滤数组

时间:2017-07-18 18:43:09

标签: javascript arrays function object

我该如何制作

var foo = [{
  "number":[1, 2, 3],
  "id": [81, 82, 83]
}];

进入这个

var foo = [{
  "number": 1,
  "id": 81
},{
  "number": 2,
  "id": 82
},{
  "number": 3,
  "id": 83
}]

我尝试了.map().filter(),但它们并没有按照我需要的方式进行。有什么建议?感谢

4 个答案:

答案 0 :(得分:1)

您可以为此创建一个函数:

function transform(values) {
  const result = [];
  values.forEach(value => {
    value.id.forEach((id, i) => {
      result.push({id, number: value.number[i]});
    });
  });
  return result;
}

答案 1 :(得分:1)

虽然我发现这是一个奇怪的问题,而且我仍然希望对我的怀疑做出回应,这是an XY problem,这是一种可能的方法,你可以用来做任何你想做的事情。

假设foo是一个单独的对象,它只包含所有相等长度数组的可枚举属性:

var foo = {
  "number": [1, 2, 3],
  "id": [81, 82, 83]
}

function spread(obj) {
  // get the enumerable keys of your object
  var keys = Object.keys(obj)
  // initialize an empty array
  var array = []

  // for each key...
  keys.forEach(function (key) {
    // for each element in the array of the property...
    obj[key].forEach(function (value, index) {
      // if the array element does not contain an object
      // initialize an empty object in index
      var base = index < array.length ? array[index] : (array[index] = {})

      // assign the value to the key in the element
      base[key] = value
    })
  })

  // return the generated array
  return array
}

console.log(spread(foo))

答案 2 :(得分:0)

您可以将数组的对象和每个对象的数字数组映射到一个新数组,然后将结果连接起来,将子数组展平为一个数组。

var foo = [{
  "number":[1, 2, 3],
  "id": [81, 82, 83]
}];

var result = [].concat.apply([], foo.map(function(obj) { // map the array into sub arrays and flatten the results with concat
  return obj.number.map(function(n, i) { // map the number array
    return {
      number: n,
      id: obj.id[i] // get the id value by using the index
    };
  })
}));

console.log(result);

答案 3 :(得分:0)

您需要根据给定密钥中的值数创建对象列表。

因此,您需要遍历主要的对象列表。在该循环内部,您需要循环键的值(即选择第一个)。您不需要直接使用这些值,它们只是确定将在最终数组中创建多少条记录。最后,您只需再次遍历键并根据当前索引映射键值对。

最后发生的Array.prototype.concat.apply([], ...arrays)将组合所有数组。

该函数支持单个对象或对象列表。

&#13;
&#13;
var foo = [{
  "number" : [ 1,  2,  3],
  "id"     : [81, 82, 83]
}, {
  "number" : [ 4,  5,  6],
  "id"     : [84, 85, 86]
}];

console.log(JSON.stringify(mapValues(foo), null, 4));

function mapValues(arr) {
  arr = !Array.isArray(arr) ? [arr] : arr;
  return Array.prototype.concat.apply([], arr.map(item => {
    return item[Object.keys(item)[0]].map((val, index) => {
      return Object.keys(item).reduce((obj, key) => {
        obj[key] = item[key][index];
        return obj;
      }, {});
    });
  }));
}
&#13;
.as-console-wrapper { top: 0; max-height: 100% !important; }
&#13;
&#13;
&#13;

这是另一个没有引入太多复杂性的版本。

&#13;
&#13;
var foo = [{
  "number" : [1, 2, 3],
  "id"     : [81, 82, 83]
}, {
  "number" : [4, 5, 6],
  "id"     : [84, 85, 86]
}];

console.log(JSON.stringify(mapValues(foo), null, 4));

function mapValues(arr) {
  arr = !Array.isArray(arr) ? [arr] : arr;
  let records = [], fields;
  arr.forEach(item => {
    fields = fields || Object.keys(item);
    item[fields[0]].forEach((val, index) => {
      records.push(fields.reduce((obj, key) => {
        obj[key] = item[key][index];
        return obj;
      }, {}));
    });
  });
  return records;
}
&#13;
.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}
&#13;
&#13;
&#13;

结果

[{
    "number": 1,
    "id": 81
}, {
    "number": 2,
    "id": 82
}, {
    "number": 3,
    "id": 83
}, {
    "number": 4,
    "id": 84
}, {
    "number": 5,
    "id": 85
}, {
    "number": 6,
    "id": 86
}]