JS使用包含特定值的元素获取新数组

时间:2016-11-04 06:30:50

标签: javascript arrays

所以我有这个数组

"myArray": [
 {
     'specialValue' : 111,
     // other values,arrays,objects and so on
 },
{
     'specialValue' : 555,
     // other values,arrays,objects and so on
 },
 {
     'specialValue' : 111,
     // other values,arrays,objects and so on
 },
 {
     'specialValue' : 555,
     // other values,arrays,objects and so on
 },
]

我想制作一个新数组,其中只包含那些具有相同specialValue的对象(及其所有属性) 请帮我用js

来做

编辑:之前不知道specialValue。我只是将这个数组作为结构示例。

7 个答案:

答案 0 :(得分:1)

您可以使用Array.prototype.reduce()

  var myArray = [{
    'specialValue': 111,
    'other values': ["arrays"]
  }, {
    'specialValue': 555,
    'other values': {}
  }, {
    'specialValue': 111,
    'other values': "abc"
  }, {
    'specialValue': 555,
    'other values': 123
  }];

var res = myArray.reduce((obj, prop) => ({specialValue:key} = prop
          , obj[key] = obj[key] ? [...obj[key], prop] : [prop], obj), {});

console.log(res);

答案 1 :(得分:1)

只需遍历所有元素并检查特殊值,如下所示:

var myArray = [
 {
     'specialValue' : 111,
     // other values,arrays,objects and so on
 },
{
     'specialValue' : 555,
     // other values,arrays,objects and so on
 },
 {
     'specialValue' : 111,
     // other values,arrays,objects and so on
 },
 {
     'specialValue' : 555,
     // other values,arrays,objects and so on
 },
];
  
var result = pickBySpecialValue(myArray, 111);
console.log(result);

function pickBySpecialValue(array, specialValue){
  var matchingItems = [];
  for(var i=0;i < array.length;i++){
    if(array[i].specialValue === specialValue){
      matchingItems.push(array[i]);
    }                               
  }
  return matchingItems;
}

答案 2 :(得分:1)

   var myArray = [
    {
     'specialValue' : 111,
    'name' : 'test1'
     // other values,arrays,objects and so on
    },
    {
     'specialValue' : 555,
    'name' : 'test2'
     // other values,arrays,objects and so on
    },
    {
     'specialValue' : 111,
    'name' : 'test3'
     // other values,arrays,objects and so on
    },
    {
     'specialValue' : 555,
    'name' : 'test4'
     // other values,arrays,objects and so on
    },
    ];
    var customArray = [];
    myArray.forEach(function(element){
    if(element.specialValue === 111) {
       customArray.push(element);
    }
    });
    console.log(customArray); // customArray contains the required value    

答案 3 :(得分:1)

我们首先按照特殊值对元素进行分组:

grouped = groupBy(arr, e => e.specialValue);

这将返回

形式的内容
{
   111: [{specialValue: 111, other stuff}, {specialValue: 111, other stuff}],
   555: [{specialValue: 555, other stuff}, {specialValue: 555, other stuff}]
}

接下来,我们将每个特殊值的所有对象合并为一个,假设您想要做的事情:

for (value in grouped) {
  grouped[value] = Object.assign({}, ...grouped[value]);
}

这会给你类似的东西

{
   111: {specialValue: 111, combined other stuff},
   555: {specialValue: 555, combined other stuff}
}

如果您只想要上述值,请抓住它们:

Object.keys(result).map(key => result[key]) 

那会给你

[
   {specialValue: 111, combined other stuff},
   {specialValue: 555, combined other stuff}
]

写作groupBy留作练习。 SO周围有很多例子,或者你可以使用下划线_.groupBy。如果你想要一个真正简单的,那就是

function groupBy(arr, keyFunc) {
  const result = {};

  for (elt of arr) {
    const key = keyFunc(elt);
    if (!(key in result)) result[key] = [];
    result[key].push(elt);
  }

  return result;
}

答案 4 :(得分:1)

这将为您提供specialValues的哈希映射作为键及其匹配条目的数组作为值

var myArray = [
  {
    'specialValue' : 111,
    // other values,arrays,objects and so on
  },
  {
    'specialValue' : 555,
    // other values,arrays,objects and so on
  },
  {
    'specialValue' : 111,
    // other values,arrays,objects and so on
  },
  {
    'specialValue' : 555,
    // other values,arrays,objects and so on
  },
];
specialArrays = {};
for (var i = myArray.length - 1; i >= 0; i--) {
  if (!Array.isArray(specialArrays[myArray[i].specialValue])) {
    specialArrays[myArray[i].specialValue] = [];
  }
  specialArrays[myArray[i].specialValue].push(myArray[i]);
}
console.log(specialArrays);

答案 5 :(得分:1)

您可以使用哈希表对其进行分组。

&#13;
&#13;
var object = { "myArray": [{ 'specialValue': 111, propA: true }, { 'specialValue': 555, propC: true }, { 'specialValue': 111, propB: true }, { 'specialValue': 555, propD: true }, ] },
    grouped = object.myArray.reduce(function (hash) {
        return function (r, a) {
            if (!hash[a.specialValue]) {
                hash[a.specialValue] = [];
                r.push(hash[a.specialValue]);
            }
            hash[a.specialValue].push(a);
            return r;
        };
    }(Object.create(null)), []);

console.log(grouped);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

ES6与Map

&#13;
&#13;
var object = { "myArray": [{ 'specialValue': 111, propA: true }, { 'specialValue': 555, propC: true }, { 'specialValue': 111, propB: true }, { 'specialValue': 555, propD: true }, ] },
    grouped = object.myArray.reduce((map =>
        (r, a) =>
           (!map.has(a.specialValue) && map.set(a.specialValue, r[r.push([]) - 1]), map.get(a.specialValue).push(a), r))(new Map), []);

console.log(grouped);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 6 :(得分:0)

如果您知道该值,则可以使用JavaScript的“过滤器”功能。

var specificVal = 555;
var newArray = myArray.filter(function(val) {
    return val.specialValue === specificVal;
});