【问题标题】:JavaScript: Search array of objects for a specific valueJavaScript:在对象数组中搜索特定值
【发布时间】:2017-07-22 19:45:47
【问题描述】:

好的,所以我有一个对象数组。使用随机生成的表值定义。我想搜索对象数组并在一个表值时执行代码,例如。 "table1" 出现超过 6 次。

这是我拥有的对象数组:

  var data = [{
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
                {
                    name: "",
                    pref: "",
                    table: ""
                },
            ];

【问题讨论】:

  • 对象的值都一样,其实……你有问题吗?
  • 您可以使用循环来迭代您的数组。
  • 你尝试了什么?
  • 只需对数组运行一个过滤器,data = data.filter ( x => { return x.name === 'value_I_want' } )。完成后,如果该数组的长度 >= 6,则运行您的代码。或者,如果您不想分配新数组,迭代数组,查找属性,如果找到它,则增加一个计数器,当该计数器为 === 6 时,跳出循环并运行您的代码。
  • @NinaScholz 这些值都在代码后面定义。

标签: javascript arrays sorting object javascript-objects


【解决方案1】:

你可以使用这个例子:

if (data.filter((item)=>{return item.table === "1"}).length >= 6)

【讨论】:

  • 太棒了!现在我可以在 while 循环中使用相同的条件吗?
  • 不,你不应该使用过滤器进行计数,这是错误的方法,因为你生成了一个结果数组,然后拒绝它。
  • @NinaScholz 哦,所以如果我使用你的方法,我该如何使用 while 循环运行直到表 1 值的数量小于 6?
【解决方案2】:

您可以使用Array#reduce 进行条件计数。

ES6

if (data.reduce((sum, item) => sum + (item.table === "1"), 0) > 6) {
    // do something
}

ES5

if (data.reduce(function (sum, item) { return sum + (item.table === "1"); }, 0) > 6) {
    // do something
}

...如果我使用您的方法,我如何使用 while 循环运行直到表 1 值的数量小于 6?

您可以使用 while 循环,并在要检查的值上加上一个闭包。

function countTable(value) {
    return function (sum, item) {
        return sum + (item.table === value);
    };
}


while (data.reduce(countTable('table1'), 0) >= 6) {
    // do something
}

【讨论】:

  • 不错的解决方案。谢谢!
  • 好的,所以我需要这个来更改表值,直到有 6 个或更少的 'table1' 值。我现在有while循环如何更改表值?有什么方法可以像在 for 循环中那样做吗?前任。数据[i].table = "table2";
  • @jscoder001,请在扩展 cmets 中的问题之前接受答案。我认为实际上没有理由改变什么属性。您可能会作为一个带有扩展参数的新问题。
  • @NinaScholz 抱歉,我是 SO 新手,但我并没有要求您更改代码。我只需要一些关于在 while 循环中放入什么的指导。我应该问这个问题吗?
  • 更多的是一个问题,你想要什么。在问题中,您要求出现 6 次以上,现在您需要 6 次或更少。也许你用一个例子来说明你在一个新问题中需要什么。
【解决方案3】:

如果找到足够的匹配元素,您也可以使用Array.prototype.some 停止计数。

function multiFind( array, property, value , count) {
    return array.some( function( c) {
        count -= c[property] == value;
        return count<=0;
    });
}

或者,这可以被压缩并用 ES6 语法编写为

var multiFind =  (a, prop, v, n) => a.some( c=> (n-=c[prop] == v)<=0);

请注意,两个版本都使用自动类型转换将布尔值 true 转换为 1false0 以进行计数。然后可以在条件语句中使用对该函数的调用,例如。

while( multiFind( data, "table", "table1", 6) ) {
    // do stuff while there are more than 5 "table1" table properties in data array
}

【讨论】:

  • 好的,我几乎可以正常工作了。你有没有机会告诉我如何定义一个变量,让我可以操纵任何“table1”的值?我需要将值移动到另一张桌子,因为每张桌子可能只有 6 位住户。
猜你喜欢
  • 2011-05-06
  • 2021-04-16
  • 2021-12-12
  • 2011-04-07
  • 2017-05-14
  • 2019-06-30
  • 2021-05-26
  • 2018-08-03
相关资源
最近更新 更多